HDU 2444 二分图判断+最大匹配
2016-04-12 15:09
525 查看
The Accomodation of Students
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4384 Accepted Submission(s): 2012
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
Source
2008 Asia Harbin Regional Contest Online
首先要判断是否为二分图,接下来就是求最大匹配了,套匈牙利算法即可
#include <iostream> #include <cstring> #define maxnum 555 using namespace std; int vis[maxnum]; int link[maxnum]; int head[maxnum]; int cnt; struct node { int v; int next; }list[maxnum*maxnum]; void init() { cnt = 0; memset(head,-1,sizeof(head)); memset(vis,0,sizeof(vis)); } void add(int u,int v) { list[cnt].v = v; list[cnt].next = head[u]; head[u] = cnt++; } int judge(int u) { int i; for(i=head[u];~i;i=list[i].next) { int v = list[i].v; if(!vis[v]) { vis[v] = !vis[u]; if(!judge(v)) return 0; } else { if(vis[u] == vis[v]) return 0; } } return 1; } int find(int u) { int i; for(i=head[u];~i;i=list[i].next) { int v = list[i].v; if(!vis[v]) { vis[v] = 1; if(link[v] == -1 || find(link[v])) { link[v] = u; return 1; } } } return 0; } int match(int N) { int i,sum=0; memset(link,-1,sizeof(link)); for(i=1;i<=N;i++) { memset(vis,0,sizeof(vis)); if(find(i)) sum++; } return sum; } int main() { int i,j,k,kk; int a,b; int len; int u,v; int p,n,N; int flag; while(~scanf("%d%d",&a,&b)) { init(); for(i=1;i<=b;i++) { scanf("%d%d",&u,&v); add(u,v); add(v,u); } if(!judge(1)) printf("No\n"); else printf("%d\n",match(a)>>1); } return 0; }
相关文章推荐
- 2015最流行的android组件、工具、框架大全(前续)
- php生成二维码
- Android开发中一些挺有用的方法
- 【BZOJ 1088 扫雷Mine】模拟
- jquery 对option 操作
- 决策树中ID3、C4.5、CART
- iOS-OC-让tableview滚动到顶部 滚动到底部
- .naturalWidth 和naturalHeight属性,
- 使用canvas实现擦玻璃效果---转载
- html5拖拽
- greenDao 备注
- 浅谈坐标系以及之间的转换
- 【架构】架构漫谈
- 集合之HashMap
- Android学习之程序创建桌面快捷方式
- Apk 签名查看_笔记
- OSSIM 高可用架构
- 【JS】:JS中如何实现对任意区间的取整
- SVN Error : is scheduled for addition, but is missing
- stm32存储结构& 存储器映射(整理)