POJ2289 Jamie's Contact Groups 二分+最大流匹配
来源:互联网 发布:北京私立汇佳学校 知乎 编辑:程序博客网 时间:2024/04/29 11:44
题目:给定人名和群组的关系,叫你把每个人分配到某个群组的关系,使这个分配方案满足最大的那个群组人数 最小。
思路:
二分图匹配。
求法是用二分答案加最大流判定。
#include<iostream>using namespace std;#define MIN(a,b) (a<b?a:b)const int N=1505,M=1100005;const int inf=(1<<29);char name[20];int n,m;struct Edge{int v,next,w,re;}edge[M];int edgehead[N];int k=1;int level[N];int visit[N];int que[N];void addedge(int u,int v,int w){edge[k].v=v;edge[k].w=w;edge[k].next=edgehead[u];edge[k].re=k+1;edgehead[u]=k++;edge[k].v=u;edge[k].w=0;edge[k].next=edgehead[v];edge[k].re=k-1;edgehead[v]=k++;}int match[1005][505];bool bfs(){memset(visit,0,sizeof(visit));memset(level,0,sizeof(level));visit[0]=true;level[0]=0;int head=1,tail=1;que[tail++]=0;while(head<tail){int now=que[head++];if(now==n+m+1){return true;}for(int i=edgehead[now];i;i=edge[i].next){int v=edge[i].v;if(!visit[v]&&edge[i].w>0){level[v]=level[now]+1;visit[v]=true;que[tail++]=v;}}}return false;}int dinic(int now,int sum){if(now==n+1+m)return sum;int os=sum;for(int i=edgehead[now];i&∑>0;i=edge[i].next){int v=edge[i].v;if(level[v]==level[now]+1&&edge[i].w>0){int tmp=dinic(v,MIN(edge[i].w,sum));edge[i].w-=tmp;edge[edge[i].re].w+=tmp;sum-=tmp;}}return os-sum;}bool make(int val){memset(edge,0,sizeof(edge));memset(edgehead,0,sizeof(edgehead));k=1;for(int i=1;i<=n;i++){addedge(0,i,1);for(int j=1;match[i][j]!=-1;j++){addedge(i,match[i][j]+n+1,1);}}for(int i=1;i<=m;i++){addedge(i+n,n+1+m,val);}int ans=0;while(bfs()){ans+=dinic(0,inf);}if(ans==n){return true;}else{return false;}}int main(){//freopen("C:\\Users\\wuyanyisb\\Desktop\\1.txt","r",stdin);while(scanf("%d%d",&n,&m),n!=0||m!=0){memset(match,0,sizeof(match));for(int i=1;i<=n;i++){scanf("%s",name);char ch;int to;ch=getchar();int j=1;while(ch!='\n'){scanf("%d",&match[i][j]);ch=getchar();j++;}match[i][j]=-1;}int s=0,t=n+1;while(s<t){int mid=(s+t)/2;if(make(mid)){t=mid;}else{s=mid+1;}}printf("%d\n",s);}return 0;}
- POJ2289 Jamie's Contact Groups 二分+最大流匹配
- poj2289 Jamie's Contact Groups(二分答案+最大流)
- POJ2289 Jamie's Contact Groups(二分图多重匹配+二分)
- POJ2289 Jamie's Contact Groups 二分图多重匹配
- POJ2289-Jamie's Contact Groups(二分图多重匹配)
- POJ2289 Jamie's Contact Groups(二分图多重匹配)
- poj2289--Jamie's Contact Groups(二分多重匹配)
- POJ2289--Jamie's Contact Groups
- poj2289 Jamie's Contact Groups
- poj2289 Jamie's Contact Groups(二部图多重匹配)
- POJ 2289 Jamie's Contact Groups 二分+最大匹配
- POJ 2289 - Jamie's Contact Groups 二分+最大流
- UValive3268 Jamie's Contact Groups(二分+最大流)
- POJ 2289 Jamie's Contact Groups(二分+最大流)
- UVA 1345 - Jamie's Contact Groups(二分+最大流)
- uva 1345 Jamie's Contact Groups (最大流+二分)
- UVALive - 3268 Jamie's Contact Groups(二分+最大流)
- poj 2289 Jamie's Contact Groups 【二分 + 最大流】
- java常用类解析八:java字符串与格式化输出
- 小刀——基于Android平台的简易计算器
- C++虚函数表解析(转)
- 竞赛题一例
- 编程题: 写一个Singleton
- POJ2289 Jamie's Contact Groups 二分+最大流匹配
- 再来一个很蛋的C++程序
- 敏捷开发用户故事系列之六:用户故事的产生与组织结构
- 显示手形鼠标,支持IE/FF/Opera
- 函数重载、覆盖、隐藏
- 嵌入式面试题
- CListCtrl列表中,改写几列的文字颜色
- SVN 与CVS 和VSS的区别
- Flash Player 11 都有哪些新功能?