题意:要求改动公司数量最少并且效率最大(效率最大也就是最大完美匹配)
其中有一个最大的问题就是最少改变公司数量(也就是最少改变多少条边)
这个知识点我也是看了网上的,关于这个知识点我也感觉很神奇。除了这个问题其他的都是模版问题了。

可以把每条边的权值扩大k倍,并且k要大于n。
然后对原计划的边都+1。最小变动数量=N-加入原计划中的点数
模版一:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=105;
const int inf=0x3f3f3f3f;
int lx[maxn],ly[maxn];
int linker[maxn];
int visx[maxn],visy[maxn];
int w[maxn][maxn];
int slack[maxn];
int n,m;
int Find(int x){visx[x]=1;for(int y=1; y<=m; y++){if(visy[y])continue;int temp=lx[x]+ly[y]-w[x][y];if(temp==0){visy[y]=1;if(!linker[y]||Find(linker[y])){linker[y]=x;return 1;}}else{slack[y]=min(slack[y],temp);}}return 0;
}
void KM(){memset(linker,0,sizeof(linker));memset(lx,0,sizeof(lx));memset(ly,0,sizeof(ly));for(int i=1; i<=n; i++){for(int j=1; j<=m; j++){lx[i]=max(lx[i],w[i][j]);}   }    for(int k=1;k<=n;k++){for(int i=1;i<=m;i++){slack[i]=inf;}while(true){memset(visx,0,sizeof(visx));memset(visy,0,sizeof(visy));if(Find(k))break;int d=inf;for(int i=1;i<=m;i++){if(visy[i]==0){d=min(slack[i],d);}}if(d==inf)return ;for(int i=1; i<=m; i++){if(visx[i]) lx[i]-=d;if(visy[i]) ly[i]+=d;elseslack[i]-=d;}}}
}
int main(){int t,sum;while(scanf("%d %d",&n,&m)!=EOF){sum=0;for(int i=1; i<=n; i++)for(int j=1; j<=m; j++){scanf("%d",&w[i][j]);w[i][j]*=66;}for(int i=1;i<=n;i++){scanf("%d",&t);w[i][t]++;sum+=w[i][t];}KM();int ans=0;for(int i=1; i<=m; i++){ans+=w[linker[i]][i];}cout<<(n-ans%66)<<" "<<(ans/66-sum/66)<<endl;}return 0;
}
模版二:超时
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxx=105;
const int inf=0x3f3f3f3f;
int n,m,w[maxx][maxx];
int mb[maxx],vb[maxx],ka[maxx],kb[maxx],p[maxx],c[maxx];
int qf,qb,q[maxx];
void Bfs(int u){int a,v=0,vl=0,d;for(int i=1;i<=n;i++) {p[i]=0,c[i]=inf;}mb[v]=u;do {a=mb[v],d=inf,vb[v]=1;for(int b=1;b<=n;b++)if(!vb[b]){if(c[b]>ka[a]+kb[b]-w[a][b]){c[b]=ka[a]+kb[b]-w[a][b];p[b]=v;}if(c[b]<d) {d=c[b];vl=b;}}for(int b=0;b<=n;b++){if(vb[b]) {ka[mb[b]]-=d;kb[b]+=d;}else {c[b]-=d;}} v=vl;} while(mb[v]);while(v) {mb[v]=mb[p[v]];v=p[v];}
}
void init(){memset(ka,0,sizeof(ka));memset(kb,0,sizeof(kb));memset(mb,0,sizeof(mb));memset(p,0,sizeof(p));memset(vb,0,sizeof(vb));memset(c,0,sizeof(c));memset(q,0,sizeof(q));
}
void KM(){for(int a=1;a<=n;a++){for(int b=1;b<=n;b++) {vb[b]=0;}Bfs(a);}
}
int main(){int t,sum;while(scanf("%d %d",&n,&m)!=EOF){sum=0;for(int i=1; i<=n; i++)for(int j=1; j<=m; j++){scanf("%d",&w[i][j]);w[i][j]*=66;}for(int i=1;i<=n;i++){scanf("%d",&t);w[i][t]++;sum+=w[i][t];}KM();int ans=0;for(int i=1; i<=m; i++){ans+=w[mb[i]][i];}cout<<(n-ans%66)<<" "<<(ans/66-sum/66)<<endl;}return 0;
}

HDU2853(最大权完美匹配)相关推荐

  1. poj2195(最大权完美匹配)

    题意:m表示人,H表示房子,一个人只能进一个房子,一个房子也只能进去一个人,房子数等于人数,现在要让所有人进入房子,求所有人都进房子最短的路径. 思路:采用最大权完美匹配 最大权完美匹配:二分图最大匹 ...

  2. poj3565(最大权完美匹配)

    题意:让N只蚂蚁到一棵苹果树,给出N个蚂蚁和N棵苹果树的对应坐标,求权值就是求坐标点之间的距离表示,要求求出最小的距离! 思路:采用最大权完美匹配问题,但是现在这道题是求最小权值,可以将求得的坐标之间 ...

  3. HDU3718(最大权完美匹配)

    题意:先给出N个字母,代表要标签:再给出M行,和第一行给出的N个标签进行匹配,之间的差代表权值.最后的相似度为最大权值为ans*1.0/n. 最大权完美匹配:二分图最大匹配是寻找最大匹配数,用匈牙利算 ...

  4. HDU3488(最大权完美匹配)

    题意:有N个城市M单程公路将它们连接起来:要求路路应该包含一个或多个循环a->B->-->p->A.每个城市都应该走一条路,在一条线路上,每个城市只需要访问一次,也就是一个城市 ...

  5. 模板 - KM算法(O(n^3))(二分图最大权完美匹配)

    整理的算法模板合集: ACM模板 题目描述 给定一张二分图,左右部均有 n 个点,共有 m 条带权边,且保证有完美匹配. 求一种完美匹配的方案,使得最终匹配边的边权之和最大. //Data const ...

  6. poj3686(最小权值完美匹配)

    开始理解的有点简单了,也是看了其他的博客之后发现问题的: 题意:因为每一个物件都是受前一个物件的时间限制,所以假设某台机器加工了k个订单,那么用时为t1 + (t1 + t2) + (t1 + t2 ...

  7. HDU1533(最小权完美匹配)

    题意:m表示人,H表示房子,一个人只能进一个房子,一个房子也只能进去一个人,房子数等于人数,现在要让所有人进入房子,求所有人都进房子最短的路径. 思路:平时使用都是最大权完美匹配,现在这道题要求最小权 ...

  8. HDU2255(最全权完美匹配)

    最大权完美匹配:二分图最大匹配是寻找最大匹配数,用匈牙利算法.当连 接的边带有权值时,要寻找匹配后权值和最大的方案,且保证 A 集合中的点均有 B 中的点能匹配.此时问题就转化为二分图最大权完美匹配. ...

  9. UVA 1349 Optimal Bus Route Design (二分图最小权完美匹配)

    恰好属于一个圈,那等价与每个点有唯一的前驱和后继,这让人想到了二分图, 把一个点拆开,点的前驱作为S集和点的后继作为T集,然后连边,跑二分图最小权完美匹配. 写的费用流..最大权完美匹配KM算法没看懂 ...

最新文章

  1. ios设置tabbar背景颜色_iOS 13 TabBar的字体颜色及背景颜色的设置
  2. 吴恩达机器学习(第三章)——线性代数回顾
  3. java代码详细注释_java代码详细注释
  4. 执行-技术人的管理之路--总结
  5. 相关登录随机验证码公共函数
  6. Win10技巧:如何确定电脑是否适用Hyper-V虚拟机?
  7. Unity创建字体库给TextMeshPro
  8. 智能汽车路径规划-曲线插值法、人工势场法
  9. 大数据处理的基本流程
  10. mysql如何使用多核cpu_利用多核 CPU 实现并行计算
  11. 英文ppt怎么翻译成中文?教你几种ppt翻译方法
  12. 如何使用IDEA创建一个新的项目
  13. VSCode的下载安装与配置教程(详细)
  14. 简单观察HoudiniAssetComponent状态(AssetState)的变化过程
  15. An error occurred uploading to the App Store.
  16. hdoj4466题解
  17. 分享:STM32与迪文屏交互,轻松实现一些简单的功能!
  18. 终于、我毕业叻,我最逗比的青春留给反作弊
  19. Unity海康视屏对接
  20. Unity解包提取资源/AssetStudio的简单使用

热门文章

  1. 爬虫scrapy框架中间件的使用
  2. 爬虫之requests模块超时参数timeout的使用
  3. RFID标签分类(按频率)
  4. Linux-centos nginx 解决“虚拟机远程连接老是断掉” 改变网络配置
  5. 实战 | 哪个瞬间让你突然觉得CV技术真有用?
  6. 谷歌简单粗暴“复制-粘贴”数据增广,刷新COCO目标检测与实例分割新高度
  7. 第二项目AIaisell(易销宝)
  8. 理解shared_ptrT
  9. 你应该知道的高性能无锁队列Disruptor
  10. VPC DHCP类型的ECS修改DNS