hdu 2444 The Accomodation of Students (判断二分图,最大匹配)

The Accomodation of Students
Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8939    Accepted Submission(s): 3925

Problem Description
There are a group of students. Some of them may know each other, while others don‘t. For example, A and B know each other, B and C know each other. But this may not imply that A and C know each other.

Now you are given all pairs of students who know each other. Your task is to divide the students into two groups so that any two students in the same group don‘t know each other.If this goal can be achieved, then arrange them into double rooms. Remember, only paris appearing in the previous given set can live in the same room, which means only known students can live in the same room.

Calculate the maximum number of pairs that can be arranged into these double rooms.

Input
For each data set:
The first line gives two integers, n and m(1<n<=200), indicating there are n students and m pairs of students who know each other. The next m lines give such pairs.

Proceed to the end of file.

Output
If these students cannot be divided into two groups, print "No". Otherwise, print the maximum number of pairs that can be arranged in those rooms.

Sample Input
4 4
1 2
1 3
1 4
2 3
6 5
1 2
1 3
1 4
2 5
3 6

Sample Output
No
3

C/C++:

  1 #include <map>
  2 #include <queue>
  3 #include <cmath>
  4 #include <vector>
  5 #include <string>
  6 #include <cstdio>
  7 #include <cstring>
  8 #include <climits>
  9 #include <iostream>
 10 #include <algorithm>
 11 #define INF 0xffffff
 12 using namespace std;
 13 const int my_max = 205;
 14
 15 int nn, mm, n, m, a, b, my_line[my_max][my_max], my_G[my_max][my_max],
 16     my_left[my_max], my_right[my_max], my_color[my_max], my_book[my_max];
 17
 18 bool my_dfs(int x)
 19 {
 20     for (int i = 1; i <= n; ++ i)
 21     {
 22         if(my_color[i] == 1 && !my_book[i] && my_G[x][i])
 23         {
 24             my_book[i] = 1;
 25             if (!my_right[i] || my_dfs(my_right[i]))
 26             {
 27                 my_right[i] = x;
 28                 return true;
 29             }
 30         }
 31     }
 32     return false;
 33 }
 34
 35 bool my_bfs(int x)
 36 {
 37     queue <int> Q;
 38     Q.push(x);
 39     my_color[x] = 1;
 40
 41     while (!Q.empty())
 42     {
 43         int my_now = Q.front();
 44         for (int i = 1; i <= n; ++ i)
 45         {
 46             if (my_G[my_now][i])
 47             {
 48                 if (my_color[i] == -1)
 49                 {
 50                     Q.push(i);
 51                     my_color[i] = !my_color[my_now];
 52                 }
 53
 54                 else if (my_color[my_now] == my_color[i])
 55                     return true;
 56             }
 57         }
 58         Q.pop();
 59     }
 60
 61     return false;
 62 }
 63
 64 int my_hungarian()
 65 {
 66     int my_ans = 0;
 67
 68     for (int i = 1; i <= n; ++ i)
 69     {
 70         memset(my_book, 0, sizeof(my_book));
 71         if (my_color[i] == 0 && my_dfs(i))
 72             my_ans ++;
 73     }
 74     return my_ans;
 75 }
 76
 77 int main()
 78 {
 79     while (~scanf("%d%d", &n, &m))
 80     {
 81         memset(my_line, 0, sizeof(my_line));
 82         memset(my_right, 0, sizeof(my_right));
 83         memset(my_color, -1, sizeof(my_color));
 84         memset(my_G, 0, sizeof(my_G));
 85
 86         while (m --)
 87         {
 88             scanf("%d%d", &a, &b);
 89             my_G[a][b] = my_G[b][a] = 1;
 90         }
 91
 92         bool flag_is_bipG = true;
 93         for (int i = 1; i <= n; ++ i)
 94             if (my_color[i] == -1 && my_bfs(i))
 95             {
 96                 flag_is_bipG = false;
 97                 printf("No\n");
 98                 break;
 99             }
100         if (!flag_is_bipG) continue;
101
102         printf("%d\n", my_hungarian());
103     }
104     return 0;
105 }

原文地址:https://www.cnblogs.com/GetcharZp/p/9462083.html

时间: 2024-11-05 16:39:18

hdu 2444 The Accomodation of Students (判断二分图,最大匹配)的相关文章

(hdu)2444 The Accomodation of Students 判断二分图+最大匹配数

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2444 Problem Description There are a group of students. Some of them may know each other, while others don't. For example, A and B know each other, B and C know each other. But this may not imply t

HDU 2444 The Accomodation of Students (二分图最大匹配+二分图染色)

[题目链接]:click here~~ [题目大意]: 给出N个人和M对关系,表示a和b认识,把N个人分成两组,同组间随意俩人互不认识.若不能分成两组输出No,否则输出两组间俩人互相认识的对数 [解题思路]:   先推断是否能构成二分图,推断二分图用交叉染色法:从某个未染色的点出发把此点染成白色,该点周围的点染成黑色.黑色周围的又染成白色.若走到某个点已经染色,而且它相邻点的颜色与它一样则不是二分图,能够这样理解,染白色既增加X集合,黑色既增加Y集合,若某个点即是X集合又是Y集合,那说明不是二分

HDU 2444 The Accomodation of Students (判断是否是二分图,然后求最大匹配)

The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Description There are a group of students. Some of them may know each other, while others don't. For example, A and B know each other, B

hdu 2444 The Accomodation of Students 判断是否为二分图+最大匹配

The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3042    Accepted Submission(s): 1425 Problem Description There are a group of students. Some of them may know each o

hdu 2444 The Accomodation of Students 【二分图判断+求最大匹配】

题目链接:http://acm.acmcoder.com/showproblem.php?pid=2444 题意:判断所有人是否分为两个集合,每个集合里的人互不相识. 思路:先判断是否为二分图,是的话求最大匹配,否则输出"No". 代码: #include <stdio.h> #include <ctime> #include <math.h> #include <limits.h> #include <complex> #i

hdu 2444 The Accomodation of Students 判断时候构成二分图 + 最大匹配

此题就是求最大匹配.不过需要判断是否构成二分图.判断的方法是人选一点标记为红色(0),与它相邻的点标记为黑色(1),产生矛盾就无法构成二分图.声明一个vis[],初始化为-1.通过深搜,相邻的点不满足异或关系就结束.如果没被标记,就标记为相邻点的异或. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue>

HDU 2444 The Accomodation of Students(二分图判定+最大匹配)

Problem Description There are a group of students. Some of them may know each other, while others don't. For example, A and B know each other, B and C know each other. But this may not imply that A and C know each other. Now you are given all pairs o

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

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

HDU 2444 The Accomodation of Students二分图判定和匈牙利算法

本题就是先判断是否可以组成二分图,然后用匈牙利算法求出最大匹配. 到底如何学习一种新算法呢? 我也不知道什么方法是最佳的了,因为看书本和大牛们写的匈牙利算法详细分析,看了差不多两个小时没看懂,最后自己直接看代码,居然不到半个小时看懂了.然后就可以直接拿来解题啦. 比如topcoder上有这个算法的很详细的分析,真没看懂. 代码居然比分析更清晰了?我也不好下结论. 但是我觉得主要的思想还是有作用的. 说说我对这个算法的理解吧: 1 假设二分图分为两个集合 U, V,那么从一个集合U出发 2 U的一