#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 1853 KM算法的更多相关文章

  1. hdu 3488(KM算法||最小费用最大流)

    Tour Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  2. HDU 2255 KM算法 二分图最大权值匹配

    奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  3. hdu 2448(KM算法+SPFA)

    Mining Station on the Sea Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

  4. hdu 3395(KM算法||最小费用最大流(第二种超级巧妙))

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

  5. hdu 4862 KM算法 最小K路径覆盖的模型

    http://acm.hdu.edu.cn/showproblem.php?pid=4862 选t<=k次,t条路要经过全部的点一次而且只一次. 建图是问题: 我自己最初就把n*m 个点分别放入 ...

  6. HDU 1533 KM算法(权值最小的最佳匹配)

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

  7. hdu 3435(KM算法最优匹配)

    A new Graph Game Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  8. hdu 2255 奔小康赚大钱--KM算法模板

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:有N个人跟N个房子,每个人跟房子都有一定的距离,现在要让这N个人全部回到N个房子里面去,要 ...

  9. hdu 2853 Assignment KM算法

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2853 Last year a terrible earthquake attacked Sichuan ...

随机推荐

  1. 使用 script 的 module 属性实现 es6 以上的兼容

    几个月前看到了这篇文章 https://philipwalton.com/articles/deploying-es2015-code-in-production-today/,给了我很大的启发,本来 ...

  2. 构造+暴力 Codeforces Round #283 (Div. 2) B. Secret Combination

    题目传送门 /* 构造+暴力:按照题目意思,只要10次加1就变回原来的数字,暴力枚举所有数字,string大法好! */ /************************************** ...

  3. 238 Product of Array Except Self 除自身以外数组的乘积

    一个长度为 n 的整形数组nums,其中 n > 1,返回一个数组 output ,其中 output[i] 等于nums中除nums[i]以外所有元素的乘积.不用除法 且在O(n)内解决这个问 ...

  4. Shell脚本,简单& 强大

      摘自<码农增刊Linus与Linux>,章节:你可能不知道的Shell.   最近阅读完这本书,觉得其中有很多不错的内容,这是其中的一个Shell小甜点,拿来和大家一起分享一下,增加了 ...

  5. 实例化WebService实例对象时出现localhost未引用命名空间

    //实例化WebService实例对象 localhost.WebService WebserviceInstance = new localhost.WebService(); 在实例化WebSer ...

  6. 简单谈谈MySQL中的int(m)

    转载地址:https://www.jb51.net/article/93760.htm 设置int型的时候,需要设置int(M),以前知道这个M最大是255,但是到底应该设置多少并没有在意.注意zer ...

  7. 2057. [ZLXOI2015]殉国

    ★☆   输入文件:BlackHawk.in   输出文件:BlackHawk.out   评测插件 时间限制:0.05 s   内存限制:256 MB [题目描述] 正义的萌军瞄准了位于南极洲的心灵 ...

  8. (转)金蝶KIS迷你版、标准版在查询数量金额明细账时提示“发生未知错误,系统当前操作被取消,请与金蝶公司联系”

    金蝶KIS迷你版.标准版在查询数量金额明细账时提示“发生未知错误,系统当前操作被取消,请与金蝶公司联系” 2013-07-10 12:17:51|  分类: 金蝶专题|举报|字号 订阅       金 ...

  9. Slow HTTP Denial of Service Attack 漏洞解决办法

    编辑 删除 问题名称: Slow HTTP Denial of Service Attack 问题URL http://10.238.*.*:58*** 风险等级: 高 问题类型: 服务器配置类 漏洞 ...

  10. sqlserver如何查询一个表的主键都是哪些表的外键

    select object_name(a.parent_object_id) 'tables'  from sys.foreign_keys a  where a.referenced_object_ ...