pku 2195 km上浙大模版

//构图 每个人到每个房子的距离

#include
<iostream> #include <queue> using namespace std; #define inf 1000000000 #define _clr(x) memset(x,0xff,sizeof(int)*n) const int MAXN = 110; int n, m; char map[MAXN][MAXN]; int fuck[MAXN][MAXN]; int match1[MAXN]; int match2[MAXN]; typedef struct { int x, y; }Node; Node mem[MAXN], home[MAXN]; int abst(int x) { if (x < 0) { x = -x; } return x; } int kuhn_munkras(int m,int n,int mat[][MAXN]) { int s[MAXN],t[MAXN],l1[MAXN],l2[MAXN],p,q,ret=0,i,j,k; for (i=0;i<m;i++) for (l1[i]=-inf,j=0;j<n;j++) l1[i]=mat[i][j]>l1[i]?mat[i][j]:l1[i]; for (i=0;i<n;l2[i++]=0); for (_clr(match1),_clr(match2),i=0;i<m;i++){ for (_clr(t),s[p=q=0]=i;p<=q&&match1[i]<0;p++) for (k=s[p],j=0;j<n&&match1[i]<0;j++) if (l1[k]+l2[j]==mat[k][j]&&t[j]<0){ s[++q]=match2[j],t[j]=k; if (s[q]<0) for (p=j;p>=0;j=p) match2[j]=k=t[j],p=match1[k],match1[k]=j; } if (match1[i]<0){ for (i--,p=inf,k=0;k<=q;k++) for (j=0;j<n;j++) if (t[j]<0&&l1[s[k]]+l2[j]-mat[s[k]][j]<p) p=l1[s[k]]+l2[j]-mat[s[k]][j]; for (j=0;j<n;l2[j]+=t[j]<0?0:p,j++); for (k=0;k<=q;l1[s[k++]]-=p); } } for (i=0;i<m;i++) ret+=mat[i][match1[i]]; return ret; } int main() { while (scanf("%d %d", &n, &m) != EOF) { if (n == 0 && m == 0) { break; } memset(mem, -1, sizeof(mem)); memset(home,-1,sizeof(home)); int i, j; int mem_num = 0, home_num = 0; for (i = 0; i < n; ++i) { getchar(); for (j = 0; j < m; ++j) { scanf("%c", &map[i][j]); if (map[i][j] == 'm') { mem[mem_num].x = i; mem[mem_num++].y = j; } else if(map[i][j] == 'H') { home[home_num].x = i; home[home_num++].y = j; } } } for (i = 0; i < mem_num; ++i) { for (j = 0; j < home_num; ++j) { fuck[i][j] = abst(mem[i].x - home[j].x) + abst(mem[i].y-home[j].y); fuck[i][j] = -fuck[i][j]; } } int result = -kuhn_munkras(mem_num,home_num,fuck); printf("%d\n", result); } return 0; }

posted on 2009-07-27 20:34  ZAFU_VA  阅读(422)  评论(0编辑  收藏  举报

导航