// IN_STACK[v]=1 means v is in STACK. out[v][0] is size of OUT(v) // Vertices are give by integers. Name[] holds their names int out[100][100]; int c, N[100], L[100], STACK[100], IN_STACK[100]; int visited[100]; char name[100]; int i,n,p; push(v){ IN_STACK[v]=1; p++; STACK[p]=v; } pop(v){ // Pops up from top to v int w=STACK[p]; while (STACK[p]!=v){ printf("%c ",name[w]); IN_STACK[w]=0; p--; w=STACK[p]; } printf("%c ",name[w]); IN_STACK[w]=0; p--; printf("\n"); } int min(int x, int y){ if (x<=y) return x; else return y; } dfs(int v) { int j,w,m; visited[v]=1; N[v]=c; c++; push(v); L[v]=N[v]; m=out[v][0]; for (j=1; j<=m; j++) { w=out[v][j]; if (visited[w]==0) { dfs(w); L[v]=min(L[v], L[w]); } else if ((N[w]