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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu-4127 Flood-it!(IDA*算法)

今天做的福州赛区区域赛的题目重现,一整场都在抠这道题仍然无法AC,时间卡的很紧,不过其实也是自己的搜索学的实在太差,紫书上刷的最少的就是第七章的题 。 我一开始就看出了这道题需要IDA*算法,但是昨天...
  • weizhuwyzc000
  • weizhuwyzc000
  • 2015年08月08日 08:57
  • 1243

HDU杭电1874-畅通工程续(dijkstra算法和Floyd算法)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1874 /************** 此题是典型的最短路径问题,以下dijkstra代码(效率高)...
  • winter2121
  • winter2121
  • 2017年02月21日 19:34
  • 243

HDU1283 最简单的计算机【模拟】

最简单的计算机 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su...
  • tigerisland45
  • tigerisland45
  • 2017年07月22日 10:03
  • 536

HDU 6214 Smallest Minimum Cut (最小割最小割边)(两种算法的分析)

Problem Description Consider a network G=(V,E) with source s and sink t. An s-t cut is a partition ...
  • zhao5502169
  • zhao5502169
  • 2017年09月17日 20:29
  • 381

hdu1034(简单模拟)

模拟的水题 题目是说,n个人坐一圈,开始每个人都有偶数个糖果,如果不相等,老师吹一次哨,每个人就把一半的糖果给右边的人,如果手里有奇数个糖果,老师会再给一个补成偶数,直到所有人糖果数相同。题目知,最后...
  • Jeromiewn
  • Jeromiewn
  • 2016年09月02日 20:38
  • 644

HDU:1869 六度分离(floyd最短路径算法打表)

六度分离 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub...
  • zugofn
  • zugofn
  • 2016年08月04日 21:01
  • 436

hdu2586 LCA模板

hdu2586 先预处理 然后是   在线询问 (也就是一边读入一边查询) #pragma comment(linker, "/STACK:1024000000,10...
  • dellaserss
  • dellaserss
  • 2012年12月06日 17:27
  • 2468

HDU 5017 模拟退火算法

#include using namespace std; const int MOD = 1E9 + 7; const double eps = 1E-8; int dx[8] = {0, 0, ...
  • Tczxw
  • Tczxw
  • 2015年08月22日 21:32
  • 379

HDU:A计划

搜索题目
  • wyxeainn
  • wyxeainn
  • 2016年09月10日 16:33
  • 416

HDU 4638--莫队算法

http://acm.hdu.edu.cn/showproblem.php?pid=4638 题意1---n的排列,给定一个区间,找出一种分组方法,组最少(每组里面的数要连续)。。 这题可以预处理...
  • xlzhang223
  • xlzhang223
  • 2016年05月17日 20:46
  • 479
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu 1533KM算法
举报原因:
原因补充:

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