您的位置:首页 > 其它

hdu 2255KM算法模板

2013-12-03 00:04 204 查看
#include<stdio.h>

#include<string.h>

#define N 400

#define inf 0x7fffffff

int Max(int a,int b ) {

return a>b?a:b;

}

int Min(int a,int b) {

return a>b?b:a;

}

int map

,lx
,ly
,s
,t
,link
,n;

int find(int u) {

int i;

s[u]=1;

for(i=1;i<=n;i++)

if(!t[i]&&lx[u]+ly[i]==map[u][i]) {

t[i]=1;

if(!link[i]||find(link[i])) {

link[i]=u;

return 1;

}

}

return 0;

}

int KM() {

int i,j,sum=0,d,k;

memset(lx,0,sizeof(lx));

memset(ly,0,sizeof(ly));

memset(link,0,sizeof(link));

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

lx[i]=Max(lx[i],map[i][j]);

for(i=1;i<=n;i++) {

d=inf;

while(1) {

memset(s,0,sizeof(s));

memset(t,0,sizeof(t));

if(find(i))break;

for(j=1;j<=n;j++)

if(s[j]) {

for(k=1;k<=n;k++)

if(!t[k])

d=Min(d,lx[j]+ly[k]-map[j][k]);

}

for(j=1;j<=n;j++) {

if(s[j])lx[j]-=d;

if(t[j])ly[j]+=d;

}

}

}

for(i=1;i<=n;i++)

sum+=map[link[i]][i];

return sum;

}

int main() {

int i,j;

while(scanf("%d",&n)!=EOF) {

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

scanf("%d",&map[i][j]);

printf("%d\n",KM());

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: