hdu 2255KM算法模板
2013-12-03 00:04
253 查看
#include<stdio.h>
#include<string.h>
#define N 400
#define inf 0x7fffffff
int Max(int a,int b ) {
return a>b?a:b;
}
int Min(int a,int b) {
return a>b?b:a;
}
int map
,lx
,ly
,s
,t
,link
,n;
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;
if(!link[i]||find(link[i])) {
link[i]=u;
return 1;
}
}
return 0;
}
int KM() {
int i,j,sum=0,d,k;
memset(lx,0,sizeof(lx));
memset(ly,0,sizeof(ly));
memset(link,0,sizeof(link));
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++) {
d=inf;
while(1) {
memset(s,0,sizeof(s));
memset(t,0,sizeof(t));
if(find(i))break;
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;
}
}
}
for(i=1;i<=n;i++)
sum+=map[link[i]][i];
return sum;
}
int main() {
int i,j;
while(scanf("%d",&n)!=EOF) {
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&map[i][j]);
printf("%d\n",KM());
}
return 0;
}
#include<string.h>
#define N 400
#define inf 0x7fffffff
int Max(int a,int b ) {
return a>b?a:b;
}
int Min(int a,int b) {
return a>b?b:a;
}
int map
,lx
,ly
,s
,t
,link
,n;
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;
if(!link[i]||find(link[i])) {
link[i]=u;
return 1;
}
}
return 0;
}
int KM() {
int i,j,sum=0,d,k;
memset(lx,0,sizeof(lx));
memset(ly,0,sizeof(ly));
memset(link,0,sizeof(link));
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++) {
d=inf;
while(1) {
memset(s,0,sizeof(s));
memset(t,0,sizeof(t));
if(find(i))break;
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;
}
}
}
for(i=1;i<=n;i++)
sum+=map[link[i]][i];
return sum;
}
int main() {
int i,j;
while(scanf("%d",&n)!=EOF) {
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&map[i][j]);
printf("%d\n",KM());
}
return 0;
}
相关文章推荐
- hdu 2255KM算法模板
- 【HDU - 5716 】带可选字符的多字符串匹配 【ShiftAnd 算法 模板】
- 算法模板之威佐夫博弈(HDU 1527 取石子游戏)
- HDU 2389 Rain on your Parade(Hopcroft-Carp算法模板)
- 算法模板之Floyd(HDU 1874 畅通工程续)
- 算法模板之尼姆博弈(HDU 1907 John)
- hdu 5145 莫队算法模板题
- HDU - 1083-Courses(匈牙利算法模板题)
- 算法模板之Kruskal(HDU 1863 畅通工程)
- hdu 2063 过山车(匈牙利算法模板)
- hdu 1054 Strategic Game(模板) 最大二分匹配,最小点覆盖 匈牙利算法
- HDU - 2063 过山车(匈牙利算法模板)
- 算法模板之欧几里得算法(HDU1019 Least Common Multiple)
- HDU 2063 过山车 匈牙利算法模板题
- HDU 2063:过山车(匈牙利算法模板题)
- 匈牙利算法模板 图的二分匹配 hdu 2063 过山车
- HDU 2063 过山车(匈牙利算法模板)
- HDU 5901 Count primes (Meisell-Lehmer算法 -- 模板)
- HDU 2389 Rain on your Parade(二分匹配+Hopcroft-Carp算法模板题)
- 最大算法【Manacher模板】HDU 3068——求最长回文子串