Http://www.cnblogs.com/zxndgv/archive/2011/08/06/2129333.html
This god says it's good.
#include <iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<string>#include<stack>#include<vector>#include<map>#include<queue>#include<algorithm>#include<utility>using namespaceStd;typedefLong LongLL;Const intn=4e3+5;Const intinf=0x3f3f3f3f;structedge{intV,next;} Edge[n*N];intHead[n],tot,n;voidAddintUintv) {EDGE[TOT].V=v; Edge[tot].next=Head[u]; Head[u]=tot++;} Stack<int>s;BOOLinstack[n],mp[n/2+5][n/2+5];intDfn[n],low[n],clk,cnt,bel[n];voidTargin (intu) {Dfn[u]=low[u]=++CLK; Instack[u]=true; S.push (U); for(intI=head[u]; ~i; I=Edge[i].next) { intv=edge[i].v; if(!Dfn[v]) {Targin (v); Low[u]=min (low[u],low[v]); } Else if(Instack[v]) Low[u]=min (low[u],dfn[v]); } if(low[u]==Dfn[u]) { ++CNT; intK; Do{k=S.top (); S.pop (); INSTACK[K]=false; BEL[K]=CNT; } while(k!=T); }}vector<int>G;intMain () {scanf ("%d",&N); memset (Head,-1,sizeof(head)); for(intI=1; i<=n; ++i) {intK; scanf ("%d",&k); for(intj=0; j<k; ++j) {intv; scanf ("%d",&v); MP[I][V]=true; Add (i,v+N); } } for(intI=1; i<=n; ++i) {intu; scanf ("%d",&u); Add (U+n,i); } for(intI=1; i<=n; ++i)if(!Dfn[i]) targin (i); for(intI=1; i<=n; ++i) {g.clear (); intk1=Bel[i],k2; for(intj=n+1; j<=n+n; ++j) {K2=Bel[j]; if(!mp[i][j-n]| | K1!=K2)Continue; G.push_back (J-N); } printf ("%d", G.size ()); for(intj=0; J<g.size (); ++j) printf ("%d", G[j]); printf ("\ n"); } return 0;}
View Code
POJ 1904 King's Quest strong connected component + binary graph augmented judgment