hdu 1533 Going Home(KM)

来源:互联网 发布:国企 保障房 知乎 编辑:程序博客网 时间:2024/05/16 10:24
#include<stdio.h>#include<string.h>#include<math.h>#define max(a,b)(a>b?a:b)#define min(a,b)(a<b?a:b)#define inf 999999999#define size 110int n,m,map[size][size],lx[size],ly[size],match[size];int visitx[size],visity[size];struct node{int x,y;}a[size],b[size];int find(int u){    visitx[u]=true;    for(int i=1;i<=m;i++){        if(!visity[i]&&lx[u]+ly[i]==map[u][i]){            visity[i]=true;            if(match[i]==-1||find(match[i])){                match[i]=u;                return true ;            }        }    }    return false ;}void KM_prefect_match(){int tmp,i,j,k;for(i=1;i<=n;i++) lx[i]=-inf;memset(ly,0,sizeof(ly));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++){while(1){memset(visitx,0,sizeof(visitx));memset(visity,0,sizeof(visity));if(find(i))break;else {tmp=inf;for(j=1;j<=n;j++){if(visitx[j]){for(k=1;k<=n;k++)if(!visity[k])tmp=min(tmp,lx[j]+ly[k]-map[j][k]);}}for(j=1;j<=n;j++){if(visitx[j])lx[j]-=tmp;if(visity[j])ly[j]+=tmp;}}}}}int main(){    while(scanf("%d%d",&n,&m),m+n){        memset(match,-1,sizeof(match));        for(int i=1;i<=n;i++){            for(int j=1;j<=n;j++){                map[i][j]=-inf;            }        }char str[size][size];int e=1,ee=1;for(i=0;i<n;i++){scanf("%s",str[i]);for(int j=0;j<m;j++){if(str[i][j]=='m'){a[e].x=i;a[e++].y=j;}else if(str[i][j]=='H'){b[ee].x=i;b[ee++].y=j;}}}for(i=1;i<=e;i++){for(int j=1;j<=ee;j++)map[i][j]=-(abs(a[i].x-b[j].x)+abs(a[i].y-b[j].y));}n=e-1;m=ee-1;        KM_prefect_match();        int ans=0;        for(i=1;i<=n;i++)            ans+=map[match[i]][i];        printf("%d\n",-ans);    }    return 0;}

0 0
原创粉丝点击