给定一个规模为n的名单,要将名单中的人归到m个组中,给出每个人可能的分组号,需要确定一种分配方案,是的最大规模的组最小
建图之后,算是一个匈牙利算法的改进,看着kuangbin的模板写的
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
const int M=2010;
int bmap[M][M];
bool bmask[M];
int nx,ny;
int vcy[M];
int cy[M][M];
int limit;
bool findpath(int u)
{
int i,j;
for(i=0;i<ny;i++)
{
if(bmap[u][i]&&!bmask[i])
{
bmask[i]=1;
if(vcy[i]<limit)
{
cy[i][vcy[i]++]=u;
return 1;
}
for(j=0;j<vcy[i];j++)
{
if(findpath(cy[i][j]))
{
cy[i][j]=u;
return 1;
}
}
}
}
return 0;
}
bool MulMatch()
{
memset(vcy,0,sizeof(vcy));
for(int i=0;i<nx;i++)
{
memset(bmask,0,sizeof(bmask));
if(!findpath(i)) return 0;
}
return 1;
}
int main()
{
char ch[2002];
int _left,_right,v;
while(scanf("%d%d",&nx,&ny)!=EOF)
{
getchar();
if(nx==0&&ny==0) break;
memset(bmap,0,sizeof(bmap));
for(int i=0;i<nx;i++)
{
gets(ch);
int len=strlen(ch);
for(int j=0;j<len;j++)
{
if(ch[j]>='0'&&ch[j]<='9')
{
v=0;
while(ch[j]>='0'&&ch[j]<='9')
{
v=v*10+ch[j++]-'0';
}
bmap[i][v]=1;
}
}
}
_left=0,_right=nx;
while(_left<_right)
{
limit=(_left+_right)/2;
if(MulMatch()) _right=limit;
else _left=limit+1;
}
printf("%d\n",_right);
}
return 0;
}