[AtCoder Code Festival 2017 QualB C/At3574] 3 Steps - 二分图染色,结论

Posted mollnn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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;
}

以上是关于[AtCoder Code Festival 2017 QualB C/At3574] 3 Steps - 二分图染色,结论的主要内容,如果未能解决你的问题,请参考以下文章

atcoder CODE FESTIVAL 2017 qual C D - Yet Another Palindrome Partitioning

@atcoder - CODE FESTIVAL 2017 Final - J@ Tree MST

Atcoder Code Festival 2017 qual C 10.22 D题题解

[Atcoder Code Festival 2017 Qual B Problem F]Largest Smallest Cyclic Shift

[AtCoder Code Festival 2017 QualB C/At3574] 3 Steps - 二分图染色,结论

CODE FESTIVAL 2017 qual B 解题报告