# hdu 1853 KM算法

#include<stdio.h>
#include<math.h>
#include<string.h>
#define N 200
#define inf 999999999
int Max(int a,int b ) {
return a>b?a:b;
}
int Min(int a,int b) {
return a>b?b:a;
}
int find(int u) {
int i;
s[u]=1;
for(i=1;i<=n;i++)
if(!t[i]&&lx[u]+ly[i]==map[u][i]) {
t[i]=1;
return 1;
}
}
return 0;
}
int KM() {
int i,j,sum=0,d,k,flag;
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(s,0,sizeof(s));
memset(t,0,sizeof(t));
if(find(i))break;
d=inf;//这个必须写到这里否则可能导致死循环我感觉4 4 1 3 3 2 1 2 4 1

for(j=1;j<=n;j++)
if(s[j]) {
for(k=1;k<=n;k++)
if(!t[k])
d=Min(d,lx[j]+ly[k]-map[j][k]);
}
for(j=1;j<=n;j++) {
if(s[j])lx[j]-=d;
if(t[j])ly[j]+=d;
}
}

}
flag=0;
for(i=1;i<=n;i++) {
flag=1;
break;
}
}
if(flag)
sum=-1;
else
sum=-sum;
return sum;
}
int main() {
int i,j,a,b,c;
while(scanf("%d%d",&n,&m)!=EOF) {
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
map[i][j]=-inf;
while(m--) {
scanf("%d%d%d",&a,&b,&c);
if(-c>map[a][b])
map[a][b]=-c;
}
printf("%d\n",KM());
}
return 0;

}

//another

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<climits>
#include<iostream>
using namespace std;
#define N 550
#define inf 1<<28
int find(int u) {
int i;
s[u]=1;
for(i=1;i<=n;i++)
if(!t[i]) {
if(lx[u]+ly[i]==map[u][i]) {
t[i]= 1;
return 1;
}
}
else
otm[i]=min(otm[i],lx[u]+ly[i]-map[u][i]);
}
return 0;
}
void KM() {
int i,j,sum=0,d,k;
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) {
for(j=1;j<=n;j++)
otm[j]=inf;
memset(s,0,sizeof(s));
memset(t,0,sizeof(t));
if(find(i))break;
d=inf;//必须加到while循环里面开始这里一直错
for(k=1;k<=n;k++)
if(!t[k])
d=min(d,otm[k]);
for(j=1;j<=n;j++) {
if(s[j])lx[j]-=d;
if(t[j])ly[j]+=d;
else
otm[j]-=d;
}
}

}

}
int main() {
int i,j,a,b,c,flag,sum;
while(scanf("%d%d",&n,&m)!=EOF) {
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
map[i][j]=-inf;
while(m--) {
scanf("%d%d%d",&a,&b,&c);
if(-c>map[a][b])
map[a][b]=-c;
}
KM();
flag=false;
sum=0;
for(i=1;i<=n;i++) {
flag=true;
break;
}
}
if(flag)
sum=-1;
else
sum=-sum;
printf("%d\n",sum);
}
return 0;
}

• 本文已收录于以下专栏：

## #HDU1853#Cyclic Tour（Km经典模型+环）

Cyclic Tour Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/65535 K (Java/Others) To...
• its_elaine
• 2017年05月01日 20:41
• 118

## HDU 1853 Cyclic Tour KM算法

• sdj222555
• 2012年08月11日 17:14
• 692

## My Brute （hdu 3315 二分图最大权匹配KM算法）

• u014422052
• 2015年07月06日 13:07
• 708

## KM算法的实现

• ChinMint
• 2017年03月14日 16:24
• 732

## hdu 1853 Cyclic Tour KM

#include #include #define M 310 #define inf 0x3f3f3f3f int n,nx,ny; int link[M],lx[M],ly[M],slack...
• KIDGIN7439
• 2014年03月15日 21:55
• 288

## hdu 1853 Cyclic Tour【KM】

• Cfreezhan
• 2013年02月26日 15:55
• 581

## hdu 1853 Cyclic Tour //km

Cyclic TourTime Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/65535 K (Java/Others)Total ...
• hqd_acm
• 2010年10月06日 10:21
• 621

## 对KM算法的理解

• mosquito_zm
• 2017年01月13日 21:45
• 386

## KM算法理解

• Triple_WDF
• 2015年11月25日 11:13
• 1205

## KM算法小结

• Last_Freezen_yue
• 2017年03月31日 22:26
• 229

举报原因： 您举报文章：hdu 1853 KM算法 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)