codeforces 862B B. Mahmoud and Ehab and the bipartiteness

Posted Omz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces 862B B. Mahmoud and Ehab and the bipartiteness相关的知识,希望对你有一定的参考价值。

http://codeforces.com/problemset/problem/862/B

题意:

给出一个有n个点的二分图和n-1条边,问现在最多可以添加多少条边使得这个图中不存在自环,重边,并且此图还是一个二分图。

思路:

想得比较复杂了。。。。其实既然已经给出了二分图并且有n-1条边,那么我们就一定可以用染色法对每一个点进行染色,从而将点划分为两个集合,然后从两个集合中分别任意选择一个点连边就行了。

一开始考虑二分图的基本属性是不存在奇数条边的环。。。并不需要这样,因为两个集合是分开的,从两个中分别任意选择一个连边,是肯定不会造成同一集合中的两点有边相连的。

代码:

 1 #include <stdio.h>
 2 #include <vector>
 3 using namespace std;
 4 
 5 vector<int> v[100005];
 6 bool vis[100005];
 7 
 8 int color[100005];
 9 
10 void dfs(int s)
11 {
12     vis[s] = 1;
13 
14     if (color[s] == 0) color[s] = 1;
15 
16     for (int i = 0;i < v[s].size();i++)
17     {
18         int to = v[s][i];
19 
20         if (!vis[to])
21         {
22             if (color[s] == 1) color[to] = 2;
23             else color[to] = 1;
24 
25             vis[to] = 1;
26             dfs(to);
27         }
28     }
29 }
30 
31 int main()
32 {
33     int n;
34 
35     scanf("%d",&n);
36 
37     for (int i = 0;i < n - 1;i++)
38     {
39         int x,y;
40 
41         scanf("%d%d",&x,&y);
42 
43         v[x].push_back(y);
44         v[y].push_back(x);
45     }
46 
47     dfs(1);
48 
49     long long cnt1 = 0,cnt2 = 0;
50 
51     for (int i = 1;i <= n;i++)
52     {
53         if (color[i] == 1) cnt1++;
54         else cnt2++;
55     }
56 
57     printf("%I64d\n",cnt1 * cnt2 - (n - 1));
58 
59     return 0;
60 }

PS:记得要用long long,要不会wa。

以上是关于codeforces 862B B. Mahmoud and Ehab and the bipartiteness的主要内容,如果未能解决你的问题,请参考以下文章

E - Mahmoud and Ehab and the bipartiteness CodeForces - 862B (dfs黑白染色)

CodeForces - 862B Mahmoud and Ehab and the bipartiteness(二分图染色)

[codeforces 260]B. Ancient Prophesy

codeforces 655B B. Mischievous Mess Makers(贪心)

codeforces 653B B. Bear and Compressing(dfs)

Codeforces Round #352 (Div. 2) B. Different is Good