hdu 1533KM算法

原创 2013年12月03日 00:39:51
#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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

KM算法 (HDU 2255 1533 1853 3488 3435 2426 2853)

http://philoscience.iteye.com/blog/1754498   讲解 讲的很详细很好 HDU 2255 #include #include #define ...

HDU 1533 && poj 2195 Going Home KM算法

Description On a grid map there are n little men and n houses. In each unit time, every little man ...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

hdu 1533 Going Home【KM匹配】

Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tot...

HDU 1533 Going Home【km应用】

HDU 1533 Going Home【km应用】http://acm.hdu.edu.cn/showproblem.php?pid=1533

HDU 1533 Going Home (KM)

Going Home Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To...

HDU1533-KM

Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To...

KM算法 HDOJ1533 匈牙利算法

我的AC代码 #include #include #include #include using namespace std; struct Node{ int x,y; }; ve...

HDU 2255 奔小康赚大钱 (二分图:KM算法)

题意: 中文题不解释 要点: KM算法是求完备匹配下的最大权匹配: 在一个二分图内,左顶点为X,右顶点为Y,现对于每组左右连接X[i]Y[j]有权w[i][j],求一种匹配使得所有w[i][j]...

hdu3315My Brute KM算法

//starvae和xingxing各有n个小弟,每个小弟都有hp和攻击力 //对于第i个小弟,starvae小弟的攻击力为a[i] ,xingxing小弟的攻击力为b[i] //每场比赛,starv...
  • cq_pf
  • cq_pf
  • 2015-08-07 14:53
  • 375

hdu3722Card Game KM算法

//n个字符串,对于一个字符串i,j 将i颠倒后与j的公共前缀的大小为i,j的权值 //问将这些字符串拼接起来得到的最大权值 //将这些字符串之间建图,直接求完备匹配的最大权匹配 #include #...
  • cq_pf
  • cq_pf
  • 2015-08-07 14:53
  • 257
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)