#include<stdio.h>
#define INF 0x3f3f3f3f
#define min(x,y) (((x)>(y))?(y):(x))
int k,c,m;
int map[240][240];
int match[240][16];
int vis[240];
int co[240];
void Floyd_Warshall()
{
int f,i,j;
for(f=1;f<=k+c;f++)
for(i=1;i<=k+c;i++)
for(j=1;j<=k+c;j++)
map[i][j]=min(map[i][j],map[i][f]+map[f][j]);
}
int dfs(int x,int limit)
{
int i,j;
for(i=1;i<=k;i++)
{
if(map[x][i]<=limit&&!vis[i])
{
vis[i]=1;
if(co[i]<m)
{
match[i][co[i]]=x;
co[i]++;
return 1;
}
for(j=0;j<m;j++)
{
if(dfs(match[i][j],limit))
{
match[i][j]=x;
return 1;
}
}
}
}
return 0;
}
int ok(int limit)
{
int i;
memset(co,0,sizeof(co));
for(i=k+1;i<=k+c;i++)
{
memset(vis,0,sizeof(vis));
if(!dfs(i,limit))
return 0;
}
return 1;
}
int main(void)
{
int i,j,max=0,l,r,mid;
scanf("%d%d%d",&k,&c,&m);
memset(map,0,sizeof(map));
for(i=1;i<=k+c;i++)
for(j=1;j<=k+c;j++)
{
scanf("%d",&map[i][j]);
if(map[i][j]==0)
map[i][j]=INF;
}
Floyd_Warshall();
for(i=1;i<=k+c;i++)
for(j=1;j<=k+c;j++)
max=max>map[i][j]?max:map[i][j];
l=0;r=max;
while(l<r)
{
mid=(l+r)/2;
if(ok(mid))
r=mid;
else
l=mid+1;
}
printf("%d\n",l);
}
poj 2112 Optimal Milking(二分图匹配)
最新推荐文章于 2020-06-21 17:07:24 发布