#include<iostream> #include<cstring> using namespace std; const int maxn=105; int DFN[105]; int low[105]; int stack[105]; int flag[105]; struct Edge{int u,v;}edge[maxn]; int head[maxn],cnt; inline void add(int u,int v){edge[++cnt].u=head[u],edge[cnt].v=v,head[u]=cnt;} int number,count,j,top; void tarjan(int u) { DFN[u]=low[u]=count++; stack[++top]=u; flag[u]=1; for(int i=head[u]; i; i=edge[i].u) { int v=edge[i].v; if(!DFN[v]) { tarjan(v); if(low[v]<low[u])low[u]=low[v]; } else if(DFN[v]<low[u]&&flag[v])low[u]=DFN[v]; } if(DFN[u]==low[u]) { do { j=stack[top--]; cout<<j<<" "; flag[j]=0; } while(j!=u); cout<<endl; } } int main() { add(1,2),add(1,3),add(4,1),add(2,4),add(3,6),add(3,5),add(3,4),add(4,6),add(5,6); tarjan(1); return 0; }