Hdu 5285 wyh2000 and pupil (bfs染色判断奇环) (二分图匹配)

题目链接:

  BestCoder Round #48 ($) 1002

题目描述:

  n个小朋友要被分成两班,但是有些小朋友之间是不认得的,所以规定不能把不认识的小朋友分在一个班级里面,并且一班的人数要比二班的人数多,每个班的人数都大于零。

解题思路:

  hdu给出的题解是二分图匹配加上贪心,就不多说了。

  还可以用bfs对节点染色,建好图后,对节点进行bfs分成,偶数成与奇数成染成不同的颜色,颜色相同的节点都可以分到同一个集合里面,但是要判断一下奇环,如果出现奇环的话,是无法进行分组的。在每次bfs的时候再加上贪心累计求和。

 1 #include <queue>
 2 #include <vector>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <iostream>
 6 #include <algorithm>
 7 using namespace std;
 8 const int maxn = 100010;
 9 vector < int > G[maxn];
10
11 int x, y, n, m, vis[maxn], flag;
12 void bfs (int s)
13 {
14     int p, q, zreo, one, num;
15     queue <int> Q;
16     zreo = 1;
17     one = vis[s] = 0;
18     Q.push(s);
19     while (!Q.empty())
20     {
21         p = Q.front();
22         Q.pop();
23         num = (vis[p] + 1) % 2;
24         for (int i=0; i<G[p].size(); i++)
25         {
26             q = G[p][i];
27             if (vis[q]!=-1 && num != vis[q])
28                 flag = 1;
29             if (vis[q]==-1)
30             {
31                 Q.push(q);
32                 vis[q] = num;
33                 if (num == 0)
34                     zreo ++;
35                 else
36                     one ++;
37             }
38         }
39     }
40     x += max (zreo, one);
41     y += min (one, zreo);
42 }
43 int main ()
44 {
45     int t;
46     scanf ("%d", &t);
47     while (t --)
48     {
49         scanf ("%d %d", &n, &m);
50         memset (vis, -1, sizeof(vis));
51         for (int i=0; i<=n; i++)
52             G[i].clear();
53         x = y = flag = 0;
54         while (m --)
55         {
56             int a, b;
57             scanf ("%d %d", &a, &b);
58             G[a].push_back (b);
59             G[b].push_back (a);
60         }
61         for (int i=1; i<=n; i++)
62         {
63             if (vis[i] == -1)
64                 bfs (i);
65             if (flag)
66                 break;
67         }
68         if (x == n)
69         {
70             x --;
71             y ++;
72         }
73         if (flag || x < 1 || y < 1)
74             printf ("Poor wyh\n");
75         else
76             printf ("%d %d\n", x, y);
77     }
78     return 0;
79 }
时间: 2024-10-18 02:43:03

Hdu 5285 wyh2000 and pupil (bfs染色判断奇环) (二分图匹配)的相关文章

HDU 5285 wyh2000 and pupil (DFS染色判二分图 + 贪心)

wyh2000 and pupil Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Submission(s): 1040    Accepted Submission(s): 331 Problem Description Young theoretical computer scientist wyh2000 is teaching his pupils. W

HDU 5285 wyh2000 and pupil(dfs或种类并查集)

wyh2000 and pupil Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Submission(s): 755    Accepted Submission(s): 251 Problem Description Young theoretical computer scientist wyh2000 is teaching his pupils. Wy

hdu 5285 wyh2000 and pupil(二染色)

第一次用vector解得题,值得纪念,这道题是二染色问题,我用bfs解得,就是染色,判断,计数问题,其 实挺简单的,就是得判一下特殊情况,当n<2的时候就不能有解,因为题目要求每个组至少有一个人,当没有不认识的 人的时候就是一个组是n-1,另一个组人数为1 上代码: #include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> #include<vector

HDU 5285 wyh2000 and pupil

题意:有一群人,已知某两人之间互相不认识,要把这群人分成两部分,每部分至少一人,且在每部分内没有人互不认识. 解法:图染色.某场bestcoder第二题……看完题觉得是个二分图……完全不会二分图什么的……但是为了挣扎一下百度了一下二分图的判定方法,知道了可以用染色法,这样如果是二分图的话将每个连通分量里点数量最多的颜色的点数量(像个绕口令诶)相加就可以了.然而激动万分的我早忘了还有每部分至少一人这个条件……直到我和队友研究怎么hack别人的时候他才告诉我还有这么个条件……(哭)还好来得及…… 代

hdu 5285 wyh2000 and pupil(二分图判定)

对每两个不认识的人连一条边,则此题可转化为二分图判定(二分图可有多个). 如果有一部分图判定为不是二分图,则输出“Poor wyh”. 否则,分别累加每个二分图的最多的颜色数. #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <string> #include <stack> #include <cmat

HDU 5285 wyh2000 and pupil (二分图)

题意:共有n个小学生,编号为1−n.将所有小学生分成2组,每组都至少有1个人.但是有些小学生之间并不认识,而且如果a不认识b,那么b也不认识a.Wyh2000希望每组中的小学生都互相认识.而且第一组的人要尽可能多.请你帮wyh2000求出第一组和第二组的人数是多少.如果找不到分组方案,则输出"Poor wyh". 思路:二分图着色.给的就是无向图,每次都累加人多的颜色即可.若不能着色,必定不能分成2组.如果全部都是1个颜色,那么要让其中1人过第2组.我勒个去,就因为赭色时颜色号码开小了

HDU 2444 The Accomodation of Students(判断是否是二分图)

题目链接 题意:n个学生,m对关系,每一对互相认识的能住一个房间.问否把这些学生分成两组,要求每组的学生都互不认识.求最多需要多少个房间. 是否能分成两组?也就是说判断是不是二分图,判断二分图的办法,用染色法 把初始点染成黑色,然后与之相连的染成白色,重复,使路径黑白相间, 如果当前点的颜色和与他相连点的颜色相同时,则说明这个图不是二分图 求最多需要多少个房间?也就是求最大匹配数. #include <iostream> #include <cstdio> #include <

[cf557d]Vitaly and Cycle(黑白染色求奇环)

题目大意:给出一个 n 点 m 边的图,问最少加多少边使其能够存在奇环,加最少边的情况数有多少种. 解题关键:黑白染色求奇环,利用数量分析求解. 奇环:含有奇数个点的环. 二分图不存在奇环.反之亦成立. #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> using nam

【POJ 2942】Knights of the Round Table(双联通分量+染色判奇环)

[POJ 2942]Knights of the Round Table(双联通分量+染色判奇环) Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 11661   Accepted: 3824 Description Being a knight is a very attractive career: searching for the Holy Grail, saving damsels in distress, an