zoukankan      html  css  js  c++  java
  • [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;
    }
    
  • 相关阅读:
    Adobe PS
    深入学习二叉树(04)平衡二叉树
    深入学习二叉树(03)二叉查找树
    C 知识点
    实战【docker 镜像制作与使用】
    从0到1了解 CI/CD
    理解Spring 容器、BeanFactory 以及 ApplicationContext
    Java 中 CAS
    volatile 关键字
    JenKins安装
  • 原文地址:https://www.cnblogs.com/mollnn/p/12270940.html
Copyright © 2011-2022 走看看