您的位置:首页 > 其它

hdu2236 无题II (二分+最大匹配)

2013-09-06 20:07 211 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2236

#include <stdio.h>
#include <string.h>
#define MAXN 102

int mp[MAXN][MAXN];
int from[MAXN],used[MAXN];
int mid,n,ptr;

int match(int x)//匈牙利算法
{
int i;
for(i=0;i<n;++i)
{
if(!used[i]&&mp[x][i]>=ptr&&mp[x][i]<=ptr+mid)
{
used[i]=1;
if(from[i]==-1||match(from[i]))
{
from[i]=x;
return 1;
}
}
}
return 0;
}

int hungary()
{
int i;
memset(from,-1,sizeof(from));
for(i=0;i<n;++i)
{
memset(used,0,sizeof(used));
if(!match(i))
return 0;
}
return 1;
}

int main()
{
int test,i,j,Max,Min,MAX,MIN,flag;
scanf("%d",&test);
while(test--)
{
scanf("%d",&n);
Min=110,Max=-10;
for(i=0;i<n;++i)
{
for(j=0;j<n;++j)
{
scanf("%d",&mp[i][j]);
Min=Min>mp[i][j]?mp[i][j]:Min;
Max=Max<mp[i][j]?mp[i][j]:Max;
}
}
MAX=Max-Min;
MIN=0;
while(1)
{
flag=0;
mid=(MIN+MAX)>>1;
for(ptr=Min;ptr+mid<=Max;ptr++)
{
if(hungary())
{
flag=1;
break;
}
}
if(MIN==mid)
break;
if(flag)
MAX=mid;
else
MIN=mid;
}
printf("%d\n",MAX);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: