#define M 10010 int STACK[M],top=0; int DFN[M],LOW[M],Index=0; bool InStack[M]; int cnumber=0; vector <int> Edge[M]; vector <int> C[M]; int Inc[M],cD[M]; void tarjan(int i){ int j; Index++; DFN[i]=LOW[i]=Index; InStack[i]=true; STACK[++top]=i; for(long unsigned int e=0;e<Edge[i].size();e++){ j=Edge[i][e]; if(DFN[j]==-1){ tarjan(j); LOW[i]=min(LOW[j],LOW[i]); } else { if(InStack[j]) LOW[i]=min(LOW[i],DFN[j]); } } if(DFN[i]==LOW[i]){ cnumber++; do{ j=STACK[top--]; InStack[j]=false; C[cnumber].push_back(j); Inc[j]=cnumber; }while(i!=j); } }