图论找环
竞赛中找环有许多种问题,判断是否有环,找到环上的点,找到环上的边等等。 而只需要找到环上相邻的两点,或者环上的一条边就可以解决这三个问题。 有向图中,可以用拓扑排序的方法,把将拓扑排序完后限制条件仍未被清零的点即在环上的点。 #include <bits/stdc++.h> #define N 1000101 using namespace std; int n, m, cnt, lin[N], deg[N]; struct edg { int to, nex; }e[N]; inline void add(int f, int t) { deg[t]++; e[++cnt].nex = lin[f]; e[cnt].to = t; lin[f] = cnt; } void topu() { queue <int> q; for (int i = 1; i <= n; i++) if (!deg[i]) q.push(i); while (!q.empty()) { int cur = q.front(); q.pop(); for (int i = lin[now]; i; i = e[i].nex) { int to = e[i].to; deg[to]--; if (!deg[to]) q.push(to); } } } int main() { scanf("%d%d",