hdu1269 有向图强连通分量 模板
额裸的强连通,判断是不是一个强连通分量==
1 #include<stdio.h> 2 #include<stack> 3 #include<string.h> 4 #include<algorithm> 5 using namespace std; 6 stack<int>s; 7 int Now,dfs_clock,scc_cnt,Head[200005],Next[200005],Point[200005]; 8 int pre[200005],lowlink[200005],sccno[200005]; 9 void add(int x,int y) 10 { 11 Next[++Now]=Head[x]; 12 Head[x]=Now; 13 Point[Now]=y; 14 } 15 void dfs(int u) 16 { 17 int v; 18 pre[u]=lowlink[u]=++dfs_clock; 19 s.push(u); 20 for (int i=Head[u];i;i=Next[i]){ 21 v=Point[i]; 22 if (!pre[v]){ 23 dfs(v); 24 lowlink[u]=min(lowlink[u],lowlink[v]); 25 } 26 else if (!sccno[v]) 27 lowlink[u]=min(lowlink[u],lowlink[v]); 28 } 29 if (lowlink[u]==pre[u]){ 30 scc_cnt++; 31 while (1){ 32 v=s.top(); s.pop(); 33 sccno[v]=scc_cnt; 34 if (v==u) break; 35 } 36 } 37 } 38 int main() 39 { 40 int x,y,n,m; 41 while (~scanf("%d%d",&n,&m)&&(n||m)){ 42 memset(Head,0,sizeof(Head)); 43 Now=0; 44 for (int i=1;i<=m;i++){ 45 scanf("%d%d",&x,&y); 46 add(x,y); 47 } 48 dfs_clock=scc_cnt=0; 49 memset(sccno,0,sizeof(sccno)); 50 memset(pre,0,sizeof(pre)); 51 while (!s.empty()) s.pop(); 52 for (int i=1;i<=n;i++) 53 if (!pre[i]) dfs(i); 54 if (scc_cnt==1) printf("Yes\n"); 55 else printf("No\n"); 56 } 57 return 0; 58 }