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 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算法的更多相关文章
- hdu 3488(KM算法||最小费用最大流)
Tour Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submis ...
- HDU 2255 KM算法 二分图最大权值匹配
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- hdu 2448(KM算法+SPFA)
Mining Station on the Sea Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- hdu 3395(KM算法||最小费用最大流(第二种超级巧妙))
Special Fish Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- hdu 4862 KM算法 最小K路径覆盖的模型
http://acm.hdu.edu.cn/showproblem.php?pid=4862 选t<=k次,t条路要经过全部的点一次而且只一次. 建图是问题: 我自己最初就把n*m 个点分别放入 ...
- HDU 1533 KM算法(权值最小的最佳匹配)
Going Home Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- hdu 3435(KM算法最优匹配)
A new Graph Game Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 2255 奔小康赚大钱--KM算法模板
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:有N个人跟N个房子,每个人跟房子都有一定的距离,现在要让这N个人全部回到N个房子里面去,要 ...
- hdu 2853 Assignment KM算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2853 Last year a terrible earthquake attacked Sichuan ...
随机推荐
- bzoj 1689: [Usaco2005 Open] Muddy roads 泥泞的路【贪心】
按左端点排序,贪心的选即可 #include<iostream> #include<cstdio> #include<algorithm> using namesp ...
- VF 查表
题目的意思就是 给你一个数字 n (1~81) 然后问你从 1~10^9 之中有多少个 各位数字之和等于 n 的 数字 我上去 打表了 而且速度还差不多 , 能在 几十分钟内算出来所有答案 ...
- [SQL必知必会] 读书笔记
第1课 数据库 这一课介绍SQL究竟是什么,它能做什么事情. 1.1 数据库基础 下面是一些数据库概念的简要介绍,如果你刚开始接触数据库,可以由此了解必需的基本知识. 1.1.1 数据库 数据 ...
- 数据结构之单链表(C实现)
list.h #ifndef LIST_H #define LIST_H #include <iostream> #include <stdio.h> #include < ...
- js jquery 获取服务器控件的三种方法
由于ASP.NET网页运行后,服务器控件会随机生成客户端id,jquery获取时候不太好操作,google了下,总结有以下3种方法: 服务器控件代码:<asp:TextBox ID=" ...
- Java 8 (6) Stream 流 - 并行数据处理与性能
在Java 7之前,并行处理集合非常麻烦.首先你要明确的把包含数据的数据结构分成若干子部分,然后你要把每个子部分分配一个独立的线程.然后,你需要在恰当的时候对他们进行同步来避免竞争,等待所有线程完成. ...
- Android RecyclerView嵌套EditView实时更新Item数据
一.场景(例如:购物车) 1.当我们需要以列表样式管理某些数据时,可能需要列表项的某个字段可编辑 2.编辑Item上的某个字段后可能还要更新相关字段的值 二.可能遇到的问题 1.列表滑动导致输入框中的 ...
- 在Redux中使用插件createAction之后
我们知道在React的Redux的中的action在项目开发过程中,一般时使用createAction来生成 举个栗子,小李子: const createTodo=createACtion('CREA ...
- tp在页面输出时间
输出时间戳 :{:time()} 输出当前时间:{:date('Y-m-d H:i:s')} 输出1970的时间:{:date('Y-m-d H:i:s',$vo['create_time'])}
- thinkphp配置设置
thinkphp惯例文件是不可更改的,有配置设置通常在Application->Commen->Conf->config.php更改. 绑定数据库信息 //'配置项'=>'配置 ...