【图论】基环树的遍历

突发奇想可以用拓扑排序的写法,从叶子开始删,然后deg为0的是父亲,deg不为0的是后继节点,最后会剩下一个环deg都是2。

        for(int i = 1; i <= n; ++i) {
            G[i].clear();
            deg[i] = 0;
            cnt[i] = 0;
        }
        for(int i = 1; i <= n; ++i) {
            int u, v;
            scanf("%d%d", &u, &v);
            G[u].push_back(v);
            G[v].push_back(u);
            ++deg[u];
            ++deg[v];
        }
        for(int i = 1; i <= n; ++i) {
            if(deg[i] == 1)
                Q.push(i);
        }
        while(!Q.empty()) {
            int u = Q.front();
            Q.pop();
            ++cnt[u];
            for(int &v : G[u]) {
                --deg[v];
                if(deg[v] != 0)
                    cnt[v] += cnt[u];
                if(deg[v] == 1)
                    Q.push(v);
            }
        }
原文地址:https://www.cnblogs.com/purinliang/p/14033781.html