10分求调
查看原帖
10分求调
1190741
Violet_Evergardon楼主2024/8/13 19:07

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;
}
2024/8/13 19:07
加载中...