标签:des style http java color os strong io
3 5 5 0 1 5 0 2 7 1 1 6 1 2 3 2 4 5 1 1 1 0 0 0 1 1 0
Case 1: 18 Case 2: 0 Case 3: -1
m!=n,把边权为负数的不读入就AC了
#include"stdio.h"
#include"string.h"
#define N 505
#define mmax(a,b) ((a)>(b)?(a):(b))
#define mmin(a,b) ((a)<(b)?(a):(b))
const int inf=(int)1e8;
int g[N][N],slack[N],n,m;
int link[N],lx[N],ly[N];
int visx[N],visy[N];
int find(int k)
{
int i;
visx[k]=1;
for(i=0;i<m;i++)
{
if(visy[i])
continue;
int d=lx[k]+ly[i]-g[k][i];
if(d==0)
{
visy[i]=1;
if(link[i]==-1||find(link[i]))
{
link[i]=k;
return 1;
}
}
else
slack[i]=mmin(slack[i],d);
}
return 0;
}
int KM()
{
int i,j;
memset(ly,0,sizeof(ly));
memset(link,-1,sizeof(link));
for(i=0;i<n;i++)
{
lx[i]=-inf;
for(j=0;j<m;j++)
{
lx[i]=mmax(lx[i],g[i][j]);
}
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
slack[j]=inf;
}
while(1)
{
memset(visx,0,sizeof(visx));
memset(visy,0,sizeof(visy));
if(find(i))
break;
else
{
int d=inf;
for(j=0;j<m;j++)
{
if(!visy[j])
d=mmin(slack[j],d);
}
for(j=0;j<n;j++)
{
if(visx[j])
lx[j]-=d;
}
for(j=0;j<m;j++)
{
if(visy[j])
ly[j]+=d;
}
}
}
}
int ans=0,cnt=0;
for(i=0;i<m;i++)
{
if(link[i]==-1)
continue;
if(g[link[i]][i]<0)
break;
cnt++;
ans+=g[link[i]][i];
}
if(cnt<n)
return -1;
return ans;
}
int main()
{
int i,j,u,v,w,e,cnt=1;
while(scanf("%d%d%d",&n,&m,&e)!=-1)
{
int max=mmax(n,m);
for(i=0;i<max;i++)
{
for(j=0;j<max;j++)
{
g[i][j]=-inf;
}
}
while(e--)
{
scanf("%d%d%d",&u,&v,&w);
if(w>=0)
g[u][v]=w;
}
printf("Case %d: %d\n",cnt++,KM());
}
return 0;
}
hdu 2426 Interesting Housing Problem (KM算法),布布扣,bubuko.com
hdu 2426 Interesting Housing Problem (KM算法)
标签:des style http java color os strong io
原文地址:http://blog.csdn.net/u011721440/article/details/38233283