标签:des style blog http java color os strong
2 100 10 15 23
123
#include"stdio.h"
#include"string.h"
#define N 305
#define mmax(a,b) ((a)>(b)?(a):(b))
#define mmin(a,b) ((a)<(b)?(a):(b))
const int inf=0x7fffffff;
int g[N][N],n;
int link[N],slack[N];
int lx[N],ly[N];
int visx[N],visy[N]; //标记左右顶点是否访问
int find(int k) //匈牙利算法(找增广路)
{
visx[k]=1;
int i,d;
for(i=0;i<n;i++)
{
if(visy[i])
continue;
d=lx[k]+ly[i]-g[k][i];
if(d==0)
{
visy[i]=1;
if(link[i]==-1||find(link[i]))
{
link[i]=k; //第K个村民选择第I个房子
return 1;
}
}
else //d!=0
slack[i]=mmin(slack[i],d);
}
return 0;
}
int KM()
{
int i,j;
memset(link,-1,sizeof(link));
memset(lx,0,sizeof(lx));
memset(ly,0,sizeof(ly));
for(i=0;i<n;i++) //初始化最大值
{
for(j=0;j<n;j++)
{
lx[i]=mmax(lx[i],g[i][j]);
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;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<n;j++) //找到最小值d
{
if(!visy[j])
{
d=mmin(d,slack[j]);
}
}
for(j=0;j<n;j++)
{
if(visx[j])
lx[j]-=d;
if(visy[j])
ly[j]+=d;
}
}
}
}
int ans=0;
for(i=0;i<n;i++)
{
ans+=g[link[i]][i];
}
return ans;
}
int main()
{
int i,j;
while(scanf("%d",&n)!=-1)
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&g[i][j]);
}
}
printf("%d\n",KM());
}
return 0;
}
hdu 2255 奔小康赚大钱(KM算法),布布扣,bubuko.com
标签:des style blog http java color os strong
原文地址:http://blog.csdn.net/u011721440/article/details/38169201