poj3686(最小权值完美匹配)
开始理解的有点简单了,也是看了其他的博客之后发现问题的:
题意:因为每一个物件都是受前一个物件的时间限制,所以假设某台机器加工了k个订单,那么用时为t1 + (t1 + t2) + (t1 + t2 + t3)......(t1+...tk) = t1 * k + t2 * (k-1) + t3 * (k-2) +...+tk,
于是把每个机器拆成N个点,1-N分别代表倒数第几个加工了这个订单;最小化N命令就是最后输出的答案ans/N。
这个思路开始只是认为是KM算法,其实要理解这个条件。
最小权值完美匹配就是通过最大权完美匹配问题转化而来的:权值取反之后,最后的输出结果取反输出即可!
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<cstdio>
#include<iomanip>
using namespace std;
const int maxx=3005;
const int inf=0x3f3f3f3f;
int linker[maxx];
int lx[maxx],ly[maxx];
char e[maxx][maxx];
int slack[maxx];
int visx[maxx],visy[maxx];
int w[maxx][maxx];
int n,m;
int p;
void init(){p=0;memset(linker,-1,sizeof(linker));memset(e,0,sizeof(e));memset(w,0,sizeof(w));
}int Find(int x){visx[x]=1;for(int y=1;y<=m;y++){if(visy[y]==0){int temp=lx[x]+ly[y]-w[x][y];if(temp==0){visy[y]=1;if(linker[y]==-1||Find(linker[y])){linker[y]=x;return 1;}}else{slack[y]=min(slack[y],temp);}}}return 0;
}
void KM(){memset(ly,0,sizeof(ly));for(int i=1;i<=n;i++){lx[i]=-inf;}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(lx[i]<w[i][j]){lx[i]=w[i][j];}}}for(int k=1;k<=n;k++){memset(slack,inf,sizeof(slack));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(d,slack[i]);}}for(int i=1;i<=n;i++){if(visx[i]==1){lx[i]-=d;}}for(int i=1;i<=m;i++){if(visy[i]==1){ly[i]+=d;}else{slack[i]-=d;}}}}
}
int main(){int t;scanf("%d",&t);int count=1;while(t--){init();scanf("%d %d",&n,&m);for(int i=1;i<=n;i++){int index=0;for(int j=1;j<=m;j++){int time;scanf("%d",&time);for(int k=1;k<=n;k++){w[i][++index]=-1*k*time;}}}m=n*m;KM();int ans=0;for(int i=1;i<=m;i++){if(linker[i]!=-1){ans+=-w[linker[i]][i];}}cout<<setiosflags(ios::fixed)<<setprecision(6)<<(double)ans/n<<endl;}return 0;
}
poj3686(最小权值完美匹配)相关推荐
- HDU6346(最小权值完美匹配)
题意:满足 xi+yj≤ai,j(1≤i,j≤n) 的约束下最大化∑ni=1xi+∑ni=1yi, 思路:采用最大权值完美匹配算法:但是现在这里是求最小权值完美匹配问题,所以只需要将权值取反最后在取反 ...
- 利用Kuhn-Munkras算法求最小权值匹配
本文参考博客: http://blog.csdn.net/zhangpinghao/article/details/12242823(代码参考该博客) http://philoscience.itey ...
- POJ-2195 Going Home 最小权值匹配
题意:给定一个网格图,图上有一些人要到一些房子当中去,人和房子的数量一样多,人和房子的曼哈顿距离作为行走的开销,问所有人走到房子中的最小开销. 解法:将人和房子之间两两之间建立带权边,权值为曼哈顿距离 ...
- HDU 1853 HDU 3488【有向环最小权值覆盖问题 】带权二分图匹配 KM算法
HDU 1853 & HDU 3488[有向环最小权值覆盖问题 ]最小费用最大流 In the kingdom of Henryy, there are N (2 <= N <= ...
- HDU 1853 HDU 3488【有向环最小权值覆盖问题 】最小费用最大流
HDU 1853 & HDU 3488[有向环最小权值覆盖问题 ]带权二分图匹配 KM算法 In the kingdom of Henryy, there are N (2 <= N & ...
- ZOJ-2342 Roads 二分图最小权值覆盖
题意:给定N个点,M条边,M >= N-1.已知M条边都有一个权值,已知前N-1边能构成一颗N个节点生成树,现问通过修改这些边的权值使得最小生成树为前N条边的最小改动总和为多少? 分析:由于计算 ...
- 小A与欧拉路 (树加边求最小权值欧拉路+树的直径)
链接:https://ac.nowcoder.com/acm/contest/369/C 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言2621 ...
- rqnoj 389 心灵的抚慰 (floyd求解环的最小权值)
PID389 / 心灵的抚慰☆ 提交你的代码 查看讨论和题解 你还木有做过哦 我的状态 查看最后一次评测记录 质量 7 题目评价 质量 7 ★★★★★ ★★★★☆ ★★★☆☆ ★★☆☆☆ ★☆☆☆☆ ...
- HDU - 3488 Tour(二分图最小权匹配+KM)
题目链接:点击查看 题目大意:给出n个城市,再给出m条有向的道路,问若想以一个或多个环的形式遍历所有的城市一次,所需要的最小权值是多少 题目分析:刚拿到这个题目是有点懵的,因为不知道题目让求什么,其实 ...
最新文章
- docker初体验:docker部署nginx负载均衡集群
- CVPR 2020 Oral | 人脸识别Loss新突破: 旷视提出Circle Loss,革新深度特征学习范式...
- JavaScript兼容HTML代码的注释
- java switch null_[改善Java代码]小心switch带来的空值异常
- evga x58服务器芯片组,为六核980X而生 EVGA发布X58 FTW3主板
- python x y z 1_Python下的数值列表 - range(x,y,z)函数
- 键盘消息捕获--MFC
- inx的c语言表达式,Spninx 解决的问题
- 2012年度IT博客大赛50强报道:马博峰
- 联想投资服务器5g芯片,从5G投票到要没必要做芯片,联想到了最危险的时候
- java最基础的小总结
- python对象回收_python 引用,拷贝,对象回收,弱引用
- CentOS linux修改主机名
- PX4无人机配置4G空地多机组网系统
- kalman滤波理解一:理论框架
- 匿名四轴上位机使用方法
- 温故而知新(一)—— 再看RNN、LSTM、GRU
- 动作事件监听器——实现ActionListener接口
- Excel批量调整行高
- js添加多个子节点_javascript如何创建子节点