HDU2853(最大权完美匹配)
题意:要求改动公司数量最少并且效率最大(效率最大也就是最大完美匹配)
其中有一个最大的问题就是最少改变公司数量(也就是最少改变多少条边)
这个知识点我也是看了网上的,关于这个知识点我也感觉很神奇。除了这个问题其他的都是模版问题了。
可以把每条边的权值扩大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(最大权完美匹配)相关推荐
- poj2195(最大权完美匹配)
题意:m表示人,H表示房子,一个人只能进一个房子,一个房子也只能进去一个人,房子数等于人数,现在要让所有人进入房子,求所有人都进房子最短的路径. 思路:采用最大权完美匹配 最大权完美匹配:二分图最大匹 ...
- poj3565(最大权完美匹配)
题意:让N只蚂蚁到一棵苹果树,给出N个蚂蚁和N棵苹果树的对应坐标,求权值就是求坐标点之间的距离表示,要求求出最小的距离! 思路:采用最大权完美匹配问题,但是现在这道题是求最小权值,可以将求得的坐标之间 ...
- HDU3718(最大权完美匹配)
题意:先给出N个字母,代表要标签:再给出M行,和第一行给出的N个标签进行匹配,之间的差代表权值.最后的相似度为最大权值为ans*1.0/n. 最大权完美匹配:二分图最大匹配是寻找最大匹配数,用匈牙利算 ...
- HDU3488(最大权完美匹配)
题意:有N个城市M单程公路将它们连接起来:要求路路应该包含一个或多个循环a->B->-->p->A.每个城市都应该走一条路,在一条线路上,每个城市只需要访问一次,也就是一个城市 ...
- 模板 - KM算法(O(n^3))(二分图最大权完美匹配)
整理的算法模板合集: ACM模板 题目描述 给定一张二分图,左右部均有 n 个点,共有 m 条带权边,且保证有完美匹配. 求一种完美匹配的方案,使得最终匹配边的边权之和最大. //Data const ...
- poj3686(最小权值完美匹配)
开始理解的有点简单了,也是看了其他的博客之后发现问题的: 题意:因为每一个物件都是受前一个物件的时间限制,所以假设某台机器加工了k个订单,那么用时为t1 + (t1 + t2) + (t1 + t2 ...
- HDU1533(最小权完美匹配)
题意:m表示人,H表示房子,一个人只能进一个房子,一个房子也只能进去一个人,房子数等于人数,现在要让所有人进入房子,求所有人都进房子最短的路径. 思路:平时使用都是最大权完美匹配,现在这道题要求最小权 ...
- HDU2255(最全权完美匹配)
最大权完美匹配:二分图最大匹配是寻找最大匹配数,用匈牙利算法.当连 接的边带有权值时,要寻找匹配后权值和最大的方案,且保证 A 集合中的点均有 B 中的点能匹配.此时问题就转化为二分图最大权完美匹配. ...
- UVA 1349 Optimal Bus Route Design (二分图最小权完美匹配)
恰好属于一个圈,那等价与每个点有唯一的前驱和后继,这让人想到了二分图, 把一个点拆开,点的前驱作为S集和点的后继作为T集,然后连边,跑二分图最小权完美匹配. 写的费用流..最大权完美匹配KM算法没看懂 ...
最新文章
- ios设置tabbar背景颜色_iOS 13 TabBar的字体颜色及背景颜色的设置
- 吴恩达机器学习(第三章)——线性代数回顾
- java代码详细注释_java代码详细注释
- 执行-技术人的管理之路--总结
- 相关登录随机验证码公共函数
- Win10技巧:如何确定电脑是否适用Hyper-V虚拟机?
- Unity创建字体库给TextMeshPro
- 智能汽车路径规划-曲线插值法、人工势场法
- 大数据处理的基本流程
- mysql如何使用多核cpu_利用多核 CPU 实现并行计算
- 英文ppt怎么翻译成中文?教你几种ppt翻译方法
- 如何使用IDEA创建一个新的项目
- VSCode的下载安装与配置教程(详细)
- 简单观察HoudiniAssetComponent状态(AssetState)的变化过程
- An error occurred uploading to the App Store.
- hdoj4466题解
- 分享:STM32与迪文屏交互,轻松实现一些简单的功能!
- 终于、我毕业叻,我最逗比的青春留给反作弊
- Unity海康视屏对接
- Unity解包提取资源/AssetStudio的简单使用