• [AtCoder Code Festival 2017 QualB C/At3574] 3 Steps


    给你一个n个点m条边的无向图,进行以下操作 如果存在两个点u和v,使得从u走三步能恰好到达v,那么在u和v之间连接一条边
    重复这个操作直到不能再连接新的边,问最后有多少条边?
    n, m <= 100000

    如果一个连通块包含奇环它一定会变成完全图

    如果一个连通块没有奇环,那么它一定是二分图,二分图一定会变成“完全二分图”

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    const int N = 1000005;
    vector <int> g[N];
    int n,m,c[N],ans,s1,s2,vis[N],flag,tot;
    
    void dfs(int p) {
        ++tot;
        if(c[p]==1) s1++;
        if(c[p]==2) s2++;
        vis[p]=1;
        for(int i=0;i<g[p].size();i++) {
            int q=g[p][i];
            if(!vis[q]) {
                c[q]=3-c[p];
                dfs(q);
            }
            else if(c[p]==c[q]) flag=1;
        }
    }
    
    signed main() {
        scanf("%lld%lld",&n,&m);
        for(int i=1;i<=m;i++) {
            int t1,t2;
            scanf("%lld%lld",&t1,&t2);
            g[t1].push_back(t2);
            g[t2].push_back(t1);
        }
        for(int i=1;i<=n;i++) {
            if(vis[i]) continue;
            s1=s2=flag=tot=0;
            c[i]=1;
            dfs(i);
            if(flag==0) ans+=s1*s2;
            else ans+=tot*(tot-1)/2;
        }
        cout<<ans-m;
    }
    
  • 相关阅读:
    28完全背包+扩展欧几里得(包子凑数)
    HDU 3527 SPY
    POJ 3615 Cow Hurdles
    POJ 3620 Avoid The Lakes
    POJ 3036 Honeycomb Walk
    HDU 2352 Verdis Quo
    HDU 2368 Alfredo's Pizza Restaurant
    HDU 2700 Parity
    HDU 3763 CDs
    POJ 3279 Fliptile
  • 原文地址:https://www.cnblogs.com/mollnn/p/12270940.html
Copyright © 2020-2023  润新知