Strongly connected components
#include <cstdio>#include<cstring>#include<cmath>#include<vector>#include<algorithm>using namespacestd;Const intmaxn= the; Vector<int>G[maxn];vector<int>Fg[maxn];vector<int>EDGE[MAXN];intFLAG[MAXN],DFN[MAXN],BELONG[MAXN];intN,t,to,time,block;structpoint{intID, DFN;} POINT[MAXN];BOOLcmpConstPoint&a,Constpoint&b) { returnA.dfn>B.DFN;}voidinit () { for(intI=0; i<maxn; i++) g[i].clear (); for(intI=0; i<maxn; i++) fg[i].clear (); for(intI=0; i<maxn; i++) edge[i].clear (); memset (Flag,0,sizeof(flag)); memset (DFN,0,sizeof(DFN)); memset (Belong,0,sizeof(Belong)); time=0, block=0;}voidDfsintNow ) {Flag[now]=1; for(intI=0; I<g[now].size (); i++) if(!Flag[g[now][i]]) DFS (g[now][i]); time++; Dfn[now]=Time ;}voidDfs (intNow ) {Belong[now]=Block; for(inti =0; I<fg[now].size (); i++) if(!Belong[fg[now][i]]) Dfs (Fg[now][i]);}intMain () { while(~SCANF ("%d",&N)) {init (); for(intI=1; i<=n; i++) {scanf ("%d",&t); while(t--) {scanf ("%d",&to ); G[i].push_back ( to+N); Fg[to+N].push_back (i); Edge[i].push_back (to); } } for(intI=1; i<=n; i++) {scanf ("%d",&t); G[t+N].push_back (i); Fg[i].push_back (t+N); } for(intI=1; i<=2*n; i++)if(!Dfn[i]) DFS (i); for(intI=0; i<2*n; i++) Point[i].id =i+1, point[i].dfn=dfn[i+1]; Sort (point, Point+N, CMP); for(inti =0; i<2*n; i++) if(!Belong[point[i].id]) Block++, Dfs (point[i].id); intTOT; intCUN[MAXN]; for(intI=1; i<=n; i++) {TOT=0; Sort (Edge[i].begin (), Edge[i].end ()); for(intj=0; J<edge[i].size (); J + +) { if(belong[i]==belong[edge[i][j]+N]) {Cun[tot]=Edge[i][j]; TOT++; }} printf ("%d", TOT); for(intx=0; x<tot; x + +) printf ("%d", cun[x]); printf ("\ n"); } } return 0;}
POJ 1904 King ' s Quest