dfs算连通性,Dijkstra算路径,在Dijkstra里面判点合法性
#include<bits/stdc++.h>
using namespace std;
const int N=2e4+5;
const int M=4e5+5;
int n,m,s,t,inf;
bool gin[N+M];
int cnt,head[M+N],to[M+N],nxt[M+N],head2[M+N],to2[M+N],nxt2[M+N],cnt2;
int dis[N+M];
bool vis[N+M];
using pii=pair<int,int>;
priority_queue<pii,vector<pii>,greater<pii>> q;
void jb(int a,int b)
{
nxt[++cnt]=head[a];
head[a]=cnt;
to[cnt]=b;
}
void jb2(int a,int b)
{
nxt2[++cnt2]=head2[a];
head2[a]=cnt2;
to2[cnt2]=b;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
jb(x,y);
jb2(y,x);
}
cin>>s>>t;
int qu[N+M],top=0;
qu[++top]=t;
while(top>0)
{
int a=qu[top];top--;
gin[a]=1;
for(int i=head2[a];i;i=nxt2[i])
{
if(gin[to2[i]]) continue;
int v=to2[i];
qu[++top]=v;
}
}
memset(dis,0x3f,sizeof(dis));
inf=dis[1];
dis[s]=0;
q.emplace(0,s);
for(int i=1;i<=n;i++)
{
while(!q.empty()&&q.top().second[vis]) q.pop();
if(q.empty())
break;
int u=q.top().second;
q.pop();
vis[u]=1;
if(u==t) break;
for(int j=head[u];j;j=nxt[j])
{
int v=to[j];
bool ok=false;
for(int l=head[v];l;l=nxt[l])
if(!l[to][gin]) ok=true;
if(ok) continue;
if(dis[v]>dis[u]+1&&!v[to][vis])
{
dis[v]=dis[u]+1;
q.emplace(dis[v],v);
}
}
}
// cout<<"QAQ"<<endl;
if(dis[t]!=inf) cout<<dis[t]<<endl;
else cout<<-1<<endl;
return 0;
}