#include<bits/stdc++.h>
using namespace std;
vector<int>ve[100005],ve1[100005];
vector<int>ans;
int vis[100005];
int n,m;
void dfs1(int root){ //先正向dfs找出栈序列
vis[root]=1;
int len=ve[root].size();
for(int i=0;i<len;i++){
if(!vis[ve[root][i]]){
dfs1(ve[root][i]);
}
}
ans.push_back(root);
}
void dfs2(int root){ //再dfs找强连通分量
vis[root]=1;
int len=ve1[root].size();
for(int i=0;i<len;i++){
if(!vis[ve1[root][i]]){
dfs2(ve1[root][i]);
}
}
}
void init(){ //注意各种数组的清空
memset(vis,0,sizeof(vis));
ans.clear();
for(int i=1;i<=n;i++){
ve[i].clear();
ve1[i].clear();
}
}
int main(){
ios::sync_with_stdio(false); //流加速
cin.tie(0),cout.tie(0);
while(cin>>n>>m){
if(n==0&&m==0)break;
init();
while(m--){
int a,b;
cin>>a>>b;
ve[a].push_back(b); //正向存图+反向存图
ve1[b].push_back(a);
}
for(int i=1;i<=n;i++){
if(!vis[i])dfs1(i);
}
int cnt=0;
memset(vis,0,sizeof(vis));
for(int i=n;i>=1;i--){
if(!vis[ans[i-1]]){ //几次dfs就是几个强连通分量
cnt++;
dfs2(ans[i-1]);
}
}
if(cnt==1)cout<<"Yes"<<endl; //如果强连通分量为1 则全部连通
else cout<<"No"<<endl;
}
return 0;
}
HDU 1269 迷宫城堡(强连通分量)
最新推荐文章于 2024-05-23 17:21:42 发布