CODE FESTIVAL 2017 qual B:C - 3 Steps 并查集判二分图、二分图性质
2017-10-24 23:48
441 查看
题目链接
题意:给一个连通的无向图,让我们往距离为三的两个不同的点添加一条边,问最终能够添加多少条边
比赛时做的没想法,官方题解讲得很清楚
假设在s和t之间存在一条长度为奇数的路径,也就是说对于某个奇数k,存在一个点的序列s=v0,v1,...,vk=t(vi和vi+1相邻)。
如果k=1,那么s和t之间本身就有一条边。如果k≥3,通过在vk−3和vk之间加边,我们得到了一条s和t之间长度为k−2的路径。通过重复这个操作,我们可以一直减少s和t之间路径的长度最后在s和t之间加一条边。
这表示了奇数长路径的重要性,以及二分图性质的重要性。
因此,在任意两点间都能找到一条奇数长度的路径,故可以将图加成一个完全图。所以答案为N(N−1)/2−M.
故答案为BW−M,B为白点个数,W为黑点个数。
二分图的充要条件:所有回路长度均为偶数
以上内容来自http://www.cnblogs.com/kkkkahlua/p/7639342.html
对于使用并查集来判断二分图,假设有n个点,我们假设对于每个i点,有一个点i+n是i点相反的颜色。每次输入两个点(a,b)的关系,我们就mix(a,b+n),mix(b,a+n)。这样每次有新的点对的关系,如果这两个点的father是同一个的话,就说明这两个点肯定无法组成二分图,因此该图不是二分图
可以理解。。。但是为啥我写的代码就wa了呢。。。一定要数一遍黑点和白点,下面代码注释部分是wa的部分,容我想想怎么回事
题意:给一个连通的无向图,让我们往距离为三的两个不同的点添加一条边,问最终能够添加多少条边
比赛时做的没想法,官方题解讲得很清楚
假设在s和t之间存在一条长度为奇数的路径,也就是说对于某个奇数k,存在一个点的序列s=v0,v1,...,vk=t(vi和vi+1相邻)。
如果k=1,那么s和t之间本身就有一条边。如果k≥3,通过在vk−3和vk之间加边,我们得到了一条s和t之间长度为k−2的路径。通过重复这个操作,我们可以一直减少s和t之间路径的长度最后在s和t之间加一条边。
这表示了奇数长路径的重要性,以及二分图性质的重要性。
Case 1. 不是二分图
不是二分图意味着存奇数长度的环,不妨设点v为环中的一点。因为图是连通图,所以对于任意的点对(s,t),总有一条路径s→v→t. 如果路径长度为偶数,则可通过加上点v处的奇环使得路径长度为奇数。因此,在任意两点间都能找到一条奇数长度的路径,故可以将图加成一个完全图。所以答案为N(N−1)/2−M.
Case 2. 是二分图
这种情况下,可以将点染成黑点和白点,每条边连接着一个白点和一个黑点。考虑任意的黑点和白点,因为图是连通图,所以黑点b和白点w之间存在着一条路径,并且显然路经长为奇数。因此,可以在b和w之间加边。另一方面,在同种颜色的点之间绝对无法加边。故答案为BW−M,B为白点个数,W为黑点个数。
二分图的充要条件:所有回路长度均为偶数
以上内容来自http://www.cnblogs.com/kkkkahlua/p/7639342.html
对于使用并查集来判断二分图,假设有n个点,我们假设对于每个i点,有一个点i+n是i点相反的颜色。每次输入两个点(a,b)的关系,我们就mix(a,b+n),mix(b,a+n)。这样每次有新的点对的关系,如果这两个点的father是同一个的话,就说明这两个点肯定无法组成二分图,因此该图不是二分图
可以理解。。。但是为啥我写的代码就wa了呢。。。一定要数一遍黑点和白点,下面代码注释部分是wa的部分,容我想想怎么回事
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <vector> #include <cstring> #include <sstream> using namespace std; const int maxn = 1e5+10; int pre[2*maxn]; int vis[2*maxn]; int find(int x){ return pre[x]==x?x:pre[x]=find(pre[x]); } void join(int a,int b){ pre[find(b)]=find(a); } int main(){ int i,j,a,b; long long n,m; while(~scanf("%lld%lld",&n,&m)){ for(i=1;i<=2*n;i++){ pre[i] = i; } bool flag = true; for(i=1;i<=m;i++){ scanf("%d%d",&a,&b); if(find(a) == find(b)){ flag = false; }else{ join(a, b+n); join(b, a+n); } } memset(vis, 0, sizeof(vis)); if(flag){ for(i=1;i<=2*n;i++){ find(i); ++vis[pre[i]]; } long long now; /*for(i=1;i<=2*n;i++){ if(vis[i]>0){ now = vis[i]; break; } }*/ //now /= 2; long long b = 1, w = 0; for(i=2;i<=n;i++){ if(find(i)==find(1)){ ++b; }else{ ++w; } } //printf("%lld\n", now * (n-now) - m); printf("%lld\n",b*w-m); }else{ printf("%lld\n",n*(n-1)/2 - m); } } return 0; }
相关文章推荐
- 【二分图染色】AtCoder CODE FESTIVAL 2017(qual B)C[3 Steps]题解
- atcoder/CODE FESTIVAL 2017 qual B/B(dfs染色判断是否为二分图)
- 【题解】Popping Balls AtCoder Code Festival 2017 qual B E 组合计数
- Atcoder CODE FESTIVAL 2017 qual C D - Yet Another Palindrome Partitioning
- CODE FESTIVAL 2017 qual C- A-B-C 总结
- 【二分图】【并查集】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem L. Canonical duel
- CODE FESTIVAL 2017 qual B C - 3 Steps
- 找规律 B - Palindrome-phobia(CODE FESTIVAL 2017 Final)
- [最小生成树 并查集] Codechef October Challenge 2017 .Lucky Edge
- [DP]Atcoder CODE FESTIVAL 2017 Final (Parallel) D - Zabuton
- atcoder CODE FESTIVAL 2017 qual A 手速(雾)赛
- CODE FESTIVAL 2017 qual A C
- Atcoder Code Festival 2016 Qual A D - マス目と整数 / Grid and Integers
- Code Festival 2017 qualA D Four Coloring[构造]
- Atcoder CODE FESTIVAL 2017 qual C 总结+ABCD题解
- [Atcoder CODE FESTIVAL 2017 qual C]D - Yet Another Palindrome Partitioning 状压DP
- Codeforces Round #360 (Div. 1) D. Dividing Kingdom II 暴力,二分图,并查集
- 【AtCoder CODE FESTIVAL 2017 qual C】D - Yet Another Palindrome Partitioning (状压dp 字符串)
- Atcoder CODE FESTIVAL 2017 Final 简要题解
- Code Festival 2017 qualA E-Modern Painting