hdu 1853 KM算法

原创 2013年12月04日 23:43:18
#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 map[N][N],lx[N],ly[N],s[N],t[N],link[N],n,m,otm[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]==-1||find(link[i])) {
                link[i]=u;
                return 1;
            }
        }
        return 0;
}
int KM() {
    int i,j,sum=0,d,k,flag;
    memset(ly,0,sizeof(ly));
    memset(link,-1,sizeof(link));
    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++) {
            if(link[i]==-1||map[link[i]][i]==-inf) {
                flag=1;
                break;
            }
            sum+=map[link[i]][i];
        }
        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 map[N][N],lx[N],ly[N],s[N],t[N],link[N],n,m,otm[N];
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;
if(link[i]==-1||find(link[i])) {
link[i]=u;
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));
memset(link,-1,sizeof(link));
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++) {
if(link[i]==-1||map[link[i]][i]==-inf) {
flag=true;
break;
}
sum+=map[link[i]][i];
}
if(flag)
sum=-1;
else
sum=-sum;
printf("%d\n",sum);
}
return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

hdu 1533 Going Home (KM算法)

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

HDU 1853 Cyclic Tour KM算法

此题的模型转化比较好 题目说是有向图,把图分成一些环,使得构成这些环总的边权值最小, 环的特性是最少两个点。 观察环这个限制,实际上就是每个点有且只有一个出边,有且只有一个入边,并且不能是...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

HDU 1853 Cyclic Tour && HDU 3488 Tour KM算法

昨天用费用流做了这两题,今天用KM做了一下,比费用流快多了,然后,其实并不会KM算法,基本是对着百度抄的,一边抄一边理解。。。 #include #include #include #include...

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

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

HDU 3718 KM算法

题意:给你一个模板串,在给你m个串

HDU-2255(KM算法)

KM算法

hdu 3722 Card Game(KM算法)

Card Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota...

HDU 3718 Similarity KM算法

题目:http://acm.hdu.edu.cn/showproblem.php?pid=3718 题意:给定一个字符串,然后输入m串字符串,使字符串中字符匹配数量最大,输出匹配量 / 字符串长度 思...

HDU 3718 Similarity【KM算法】

题目链接 题意:两串字母匹配,求最大权匹配除以长度。 二分图最大权匹配KM算法模板题。 #include #include #include #include #include using ...

hdu 1853 Cyclic Tour【最小费用最大流】

Cyclic Tour Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/65535 K (Java/Others) To...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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