hdu 1269 入手强连通

思路待整理

#include<cstdio> #include<iostream> #include<cstring> #include<vector> #include<cmath> #define maxn 10001
using namespace std; int n,m,vis[maxn],low[maxn],dfn[maxn]; vector<int> fuck[maxn]; int sum,ret; int minn(int x,int y) { if(x>y) return y; else return x; } void init() { sum=0; ret=1; for(int i=1;i<=n;i++) fuck[i].clear(),low[i]=dfn[i]=vis[i]=0; } void dfs(int pos) { vis[pos]=1; low[pos]=dfn[pos]=ret++; for(int i=0;i<fuck[pos].size();i++) { int temp=fuck[pos][i]; if(vis[temp]==0) dfs(temp); if(vis[temp]==1) low[pos]=minn(low[pos],low[temp]);//回溯处理 } if(low[pos]==dfn[pos]) sum++; //回溯处理 } int main() { while(cin>>n>>m&&(m+n)) { init(); while(m--) { int x,y; cin>>x>>y; if(x==y) continue; fuck[x].push_back(y); } for(int i=1;i<=n;i++) if(!vis[i]) dfs(i); if(sum==1) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }
原文地址:https://www.cnblogs.com/z1141000271/p/5890521.html