大致题意:

n个部队到m个地区抗震救灾(缅怀四川地震死难同胞)。已知每只部队到每个地区的收益值,现在给出一种匹配方案。求出达到最大匹配时的收益值比当前匹配方案多多少,且需要有多少只部队的调动不需要改动。

大致思路:

由于种种原因不能直接按照mapch数组直接来求匹配的变动数,在这里我们把所有的收益值乘以10,如果之前的方案中   i->j,则在map[i][j]上面加一个1。然后在求最大匹配的时候对收益取余便能得到匹配的变动数。

#include<cstdio>
#include<cstring>
using namespace std;
const int nMax=55;
const int inf=1<<30;
int map[nMax][nMax];
int lx[nMax],ly[nMax];
int mapch[nMax];
int stack[nMax];
bool sy[nMax],sx[nMax];
int n,m,e,cnt;
int find (int u){int v,t;sx[u]=1;for(v=1;v<=m;v++){if(sy[v]) continue;t=lx[u]+ly[v]-map[u][v];if(t==0){sy[v]=1;if(mapch[v]==-1||find(mapch[v])){mapch[v]=u;return 1;}}else if(t<stack[v]) stack[v]=t;}return 0;
}
int KM(){int i,j,k,d,sum=0;cnt=0;for(i=1;i<=m;i++)ly[i]=0;memset(mapch,-1,sizeof(mapch));for(i=1;i<=n;i++){lx[i]=-inf;for(j=1;j<=m;j++)if(map[i][j]>lx[i])lx[i]=map[i][j];}for(i=1;i<=n;i++){for(j=1;j<=m;j++)stack[j]=inf;while(1){for(k=1;k<=m;k++) sy[k]=0;for(k=1;k<=n;k++) sx[k]=0;if(find(i)) break;d=inf;for(k=1;k<=m;k++)if(!sy[k]&&stack[k]<d)d=stack[k];for(k=1;k<=n;k++)if(sx[k]) lx[k]-=d;for(k=1;k<=m;k++)if(sy[k]) ly[k]+=d;else stack[k]-=d;}}for(i=1;i<=m;i++)if(mapch[i]!=-1&&map[mapch[i]][i]!=-inf){sum+=map[mapch[i]][i]/10;cnt+=map[mapch[i]][i]%10;}return sum;
}int main(){int i,j,a,b,c,sum;while(scanf("%d%d",&n,&m)!=EOF) {sum=0;for(i=1;i<=n;i++)for(j=1;j<=m;j++)map[i][j]=-inf;for(i=1;i<=n;i++){for(j=1;j<=m;j++){scanf("%d",&map[i][j]);map[i][j]*=10;}}for(i=1;i<=n;i++){scanf("%d",&a);sum+=map[i][a]/10;map[i][a]+=1;}int ans=KM();printf("%d %d\n",n-cnt,ans-sum);}return 0;
}

[KM算法]hdoj 2853:Assignment相关推荐

  1. [最小费用流 || KM算法]hdoj 3395:Special Fish

    大致题义: 给出n条鱼之间相互攻击的关系以及每条鱼的能量值,每条鱼只能攻击或者被攻击最多一次(也就是被攻击之后无法攻击别人,或者攻击别人之后无法被攻击).一次攻击行为产能为这两条鱼能量值的异或值.求总 ...

  2. 【KM匹配】 HDOJ 2853 Assignment

    题意:求最大权匹配,要求改动最少....做法很巧妙,现在原权值乘上一个很大的倍数,比如100,然后再加上一个小量,加上小量以后对匹配出来的结果没有影响,但可以求解出改动最小... #include & ...

  3. 最大流增广路(KM算法) HDOJ 1853 Cyclic Tour

    题目传送门 1 /* 2 KM: 相比HDOJ_1533,多了重边的处理,还有完美匹配的判定方法 3 */ 4 #include <cstdio> 5 #include <cmath ...

  4. [KM算法]hdoj 3722:Card Game

    大致题意:     要把n个字符串首尾相连成若干个环,如果把s1接到s2的后面可以得到一定的收获值,这个值等于s2的逆序 和s1的最长相同前缀的长度.求总收获值最大是多少. 大致思路:     看完题 ...

  5. [KM算法]hdoj 3718:Similarity

    大致题意: 给你两个长度相同的字符串,问这两个串中的字母怎么样匹配才能使得总的复合度最大. 大致思路: 按照字母间的对应关系建二分图,求出最大全匹配后除以总长度. #include<cstdio ...

  6. [KM算法]hdoj 2426:Interesting Housing Problem

    大致题意: 有n个小孩要去m间屋子,每间屋子只能住一个人.每个小孩都会对一些屋子打分.已知每个小孩不能去那些他打负分和没打分的屋子,求安排住宿后所有人对自己屋子打分之和最大值是多少. 大致思路: KM ...

  7. KM算法 入门——[kuangbin]KM匹配

    之前写过了关于普通二分匹配的相关题目了,就是寻找尽量多的边使得任意边连接的两点都没有与其他边相连,而km算法解决的则是在带权的二分图中寻找权值和最大的匹配,可以通过先给无连接的点连上权值为0或者负无穷 ...

  8. HDU 2255 奔小康赚大钱 带权二分图匹配 KM算法

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

  9. HDU(2255),KM算法,最大权匹配

    题目链接 奔小康赚大钱 Time Limit: 1000/1000MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...

最新文章

  1. SECTIONS bss段初始化分析
  2. 教育部发文35所高校新增AI本科专业!想回去重新高考
  3. iOS9基础知识(OC)笔记
  4. 从架构理解价值-我的软件世界观
  5. 关于DEBUG的一点体会
  6. [IOS]clang diagnostic、Wprotocol ..
  7. (转)PowerHA完全手册(一,二,三)
  8. android的开始时对bug的定位和处理
  9. 我的世界pc正版好玩的服务器,都来看看好玩的服务器
  10. access建立两个字段唯一索引_面试官:谈谈你对mysql索引的认识?
  11. 强化学习 马尔可夫决策过程(MDP)是什么
  12. WPF-将DataGrid控件中的数据导出到Excel
  13. 【嵌入式】NBIoT(BC26)低功耗模式与控制
  14. Java面试:应聘Java开发工程师的基本要求是什么?
  15. Codeforces Round 1299 简要题解
  16. 重庆地区外卖店铺分析系统的设计与实现
  17. qq街景输入 dir-item.js
  18. 获取wifi 的ssid出现unknown ssid
  19. python3从零学习-python宗谱
  20. android粘性广播删除,android 广播机制(2) 粘性广播-Go语言中文社区

热门文章

  1. Live回顾:软件定义汽车时代,智能汽车电子构架如何变革迎接数字化重塑?(深度)...
  2. Excel如何批量将图片按比例扩大?
  3. mysql数据库优化 曹政_MySQL:数据库优化,看这篇就够了
  4. 旅游景区管理系统(四 )代码介绍和展示(MFC实现)
  5. 计算机vf知识题库,计算机二级VF上机题库及答案
  6. 作业Week9、10+月模拟题3、4+CSP3、4+限时大模拟10、14
  7. JDA云服务助联想利润增长225%
  8. 如何免费将PDF转换为Excel格式
  9. 树莓派驱动MG996R
  10. 5G时代下,互联网的进化——视联网与物联网