zoukankan      html  css  js  c++  java
  • codeforces 962 F Simple Cycles Edges

    求简单环,即求点=边数的点双分量,加上判断点和边的模板即可 (简单环模板,区分与点双缩点)

    const int maxm = 1e5+5;
    
    int head[maxm<<1], edgecnt, dfn[maxm], low[maxm], bcc_cnt, bccnum[maxm], dfs_clock, s[maxm], top;
    vector<int> bcc[maxm], ans;
    
    struct edge{
        int u, v, nex;
    } edges[maxm<<1];
    
    void addedge(int u, int v) {
        edges[++edgecnt].u = u;
        edges[edgecnt].v = v;
        edges[edgecnt].nex = head[u];
        head[u] = edgecnt;
    }
    
    void tarjan(int u, int fa) {
        dfn[u] = low[u] = ++dfs_clock;
        int child = 0, v;
        for(int i = head[u]; i; i = edges[i].nex) {
            v = edges[i].v;
            if(v == fa) continue;
            if(!dfn[v]) {
                s[++top] = i;
                tarjan(v, u);
                low[u] = min(low[u], low[v]);
                if(low[v] >= dfn[u]) {
                    bcc[++bcc_cnt].clear();
                    int vet = 0;
                    bool ok = true;
                    while(true) {
                        int num = s[top--];
                        bcc[bcc_cnt].push_back((num+1)/2);                                      
                        if(bccnum[edges[num].v] != bcc_cnt) {
                            vet++;
                            bccnum[edges[num].v]=bcc_cnt;
                        } else ok = false;
                        if(edges[num].u == u && edges[num].v == v) break;
                    }
                    if(ok && vet>1)
                        for(int i = 0; i < bcc[bcc_cnt].size(); ++i)
                            ans.push_back(bcc[bcc_cnt][i]);
                }
            } else if(dfn[v] < dfn[u]){
                s[++top] = i;
                low[u] = min(low[u], dfn[v]);
            }
        }
    }
    
    void run_case() {
        int n, m, u, v;
        cin >> n >> m;
        for(int i = 1; i <= m; ++i) {
            cin >> u >> v;
            addedge(u, v), addedge(v, u);
        }
        for(int i = 1; i <= n; ++i)
            if(!dfn[i])
                tarjan(i, -1);
        sort(ans.begin(), ans.end());
        cout << ans.size() << "
    ";
        for(int i : ans)
            cout << i << " ";
        
    }
    
    int main() {
        ios::sync_with_stdio(false), cin.tie(0);
        run_case();
        return 0;
    }
    View Code
  • 相关阅读:
    Java对MongoDB的CRUD
    MongoDB数据库基本用法
    MySQL order by 排序结果不正确
    Linux shell 脚本 eq,ne,le,ge,lt,gt意义
    Linux shell 命令运行符 &,;,&& 区别
    Linux netstat 命令详解
    Linux ss 命令详解
    Linux sort 命令详解
    Linux sed 命令详解
    Linux xargs 命令详解
  • 原文地址:https://www.cnblogs.com/GRedComeT/p/12259130.html
Copyright © 2011-2022 走看看