#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+5;
int a[maxn],b[maxn];
vector<int> p[maxn],q[maxn];//原图,反向图
int vis[maxn];
int k;
void dfs1(int x){
vis[x]=1;
for(int i=0;i<p[x].size();i++){
if(vis[p[x][i]]==0) dfs1(p[x][i]);
}
a[++k]=x;
}
void dfs2(int x,int y){
vis[x]=0;
b[x]=y;
for(int i=0;i<q[x].size();i++){
if(vis[q[x][i]]) dfs2(q[x][i],y);
}
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
if(n==0&&m==0) break;
k=0;
for(int i=0;i<=n;i++){
p[i].clear();
q[i].clear();
}
memset(vis,0,sizeof(vis));
memset(b,0,sizeof(b));
memset(a,0,sizeof(a));
int x,y;
for(int i=0;i<m;i++){
scanf("%d%d",&x,&y);
p[x].push_back(y);
q[y].push_back(x);
}
for(int i=1;i<=n;i++){
if(vis[i]==0) dfs1(i);
}
int f=0;
for(int i=n;i>=1;i--){
if(vis[a[i]]) dfs2(a[i],f++);
}
if(f==1) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
hdu1269强连通分量(kosaraju算法)
最新推荐文章于 2023-08-22 16:55:02 发布
本文介绍了如何使用C++实现深度优先搜索(DFS)和广度优先搜索(BFS),并通过一个实例探讨了在解决连通性和路径问题中的应用。通过`bits/stdc++.h`库,我们展示了如何在实际项目中维护原图和反向图,以及vis数组的使用。最后,通过对比两种搜索策略,讨论了它们在不同场景下的优劣。
摘要由CSDN通过智能技术生成