tarjan找基环树的环
1 void dfs(int x, int last) { 2 dfn[x] = ++sz; 3 for(int i = head[x]; i; i = e[i].nxt) { 4 if(i == last ^ 1) continue; 5 int nt = e[i].to; 6 if(dfn[nt]) { 7 if(dfn[nt] < dfn[x]) continue; 8 cur.push_back(x); mk[x] = 1; 9 for(; nt != x; nt = pre[nt]) cur.push_back(nt), mk[nt] = 1; 10 } 11 else pre[nt] = x, dfs(nt, i); 12 } 13 }