hdu 1533KM算法

#include<stdio.h>
#include<string.h>
#include<math.h>
#define inf 0x3fffffff
#define N 300
int map[N][N];
char s[N][N];
int ss[N],tt[N],mark[N],lx[N],ly[N];
struct node{
int x,y;
}man[N],hos[N];
int link[N],n;
int find(int u) {
ss[u]=1;
int i;
for(i=1;i<=n;i++)
if(!tt[i]&&lx[u]+ly[i]==map[u][i]) {
    tt[i]=1;
    if(link[i]==-1||find(link[i])) {
        link[i]=u;
        return 1;
    }
}
return 0;
}
int Max(int a,int b) {
return a>b?a:b;
}
int Min(int a,int b) {
return a>b?b:a;
}
int KM() {
    int d,i,j,k,sum=0;
    memset(link,-1,sizeof(link));
    memset(ly,0,sizeof(ly));
    for(i=1;i<=n;i++) {
            lx[i]=-inf;
        for(j=1;j<=n;j++)
        lx[i]=Max(lx[i],map[i][j]);
    }
    for(i=1;i<=n;i++) {
     while(1) {
            memset(ss,0,sizeof(ss));
        memset(tt,0,sizeof(tt));
        if(find(i))break;
        d=inf;//注意要在这里初始化
       for(j=1;j<=n;j++) {
        if(ss[j]) {
            for(k=1;k<=n;k++)
                if(!tt[k])
                d=Min(d,lx[j]+ly[k]-map[j][k]);
        }
       }
       for(j=1;j<=n;j++) {
        if(ss[j])lx[j]-=d;
        if(tt[j])ly[j]+=d;
       }
     }
    }
    for(i=1;i<=n;i++)
        sum=sum+map[link[i]][i];
        return -sum;
}
int main() {
    int m,i,j,ma,ho;
    while(scanf("%d%d",&n,&m),n||m) {
        ma=0;ho=0;
    for(i=1;i<=n;i++)
        scanf("%s",s[i]+1);
        ho=0;ma=0;
    for(i=1;i<=n;i++)
    for(j=1;j<=m;j++) {
        if(s[i][j]=='m')
            man[++ma].x=i,man[ma].y=j;
            if(s[i][j]=='H')
                hos[++ho].x=i,hos[ho].y=j;
    }
    for(i=1;i<=ma;i++)
        for(j=1;j<=ma;j++)
        map[i][j]=-1*(fabs(1.0*man[i].x-1.0*hos[j].x)+fabs(1.0*man[i].y-1.0*hos[j].y));
        n=ma;
    printf("%d\n",KM());
        }
return 0;
}
posted @ 2013-12-03 00:39  HYDhyd  阅读(133)  评论(0编辑  收藏  举报