POJ 3686 The Windy's
POJ_3686
看到这个题目后,首先一个思路就是相当于安排每个东西是第几次交给哪个机器做,这样就可以把每个机器拆成N个点当成二分图匹配的题目来做了。但是遇到的最大的问题就是,每个东西的总制造时间会依赖与前面制造的东西,这样每个东西的制造时间就不能独立计算,也就不能用二分图匹配去做了。
但实际上计算这些东西总的制造时间还有另外一种方式,就是对于每个物品而言,除了计算它本身消耗的时间,同时计算上后面的物品会因为它的制造而额外增加的时间。比如如果制造当前这个物品需要的时间是t,而后面还有k个物品要制造,那么就等同于这个物品一共消耗了t+k*t的时间。这样转化之后就会发现计算每个物品的制造时间就仅仅依赖与后面有多少个物品,而不再依赖于这些物品是什么了,这样就可以用二分图匹配来做了:将每个机器都拆成N个点,分别表示是倒数第几次在这个机子上做的,然后建图用KM求解二分图最优匹配即可。
#include<stdio.h> #include<string.h> #include<algorithm> #define MAXN 60 #define MAXM 2510 #define INF 0x3f3f3f3f int N, M, xM[MAXN], yM[MAXM], g[MAXN][MAXN], G[MAXN][MAXM], MAX; int A[MAXN], B[MAXM], slack, visx[MAXN], visy[MAXM]; void init() {int i, j, k;MAX = 0;scanf("%d%d", &N, &M);for(i = 1; i <= N; i ++)for(j = 1; j <= M; j ++){scanf("%d", &g[i][j]);MAX = std::max(MAX, g[i][j] * N);}for(i = 1; i <= N; i ++)for(j = 1; j <= M; j ++)for(k = 1; k <= N; k ++)G[i][N * (j - 1) + k] = MAX - k * g[i][j]; } int searchpath(int cur) {int i;visx[cur] = 1;for(i = 1; i <= N * M; i ++)if(!visy[i]){int t = A[cur] + B[i] - G[cur][i];if(t == 0){visy[i] = 1;if(yM[i] == -1 || searchpath(yM[i])){yM[i] = cur, xM[cur] = i;return 1;}}elseslack = std::min(slack, t);}return 0; } void solve() {int i, j, ans = 0;memset(yM, -1, sizeof(yM));memset(B, 0, sizeof(B));for(i = 1; i <= N; i ++){A[i] = 0;for(j = 1; j <= N * M; j ++) A[i] = std::max(A[i], G[i][j]);}for(i = 1; i <= N; i ++)for(;;){slack = INF;memset(visx, 0, sizeof(visx));memset(visy, 0, sizeof(visy));if(searchpath(i)) break;for(j = 1; j <= N; j ++) if(visx[j]) A[j] -= slack;for(j = 1; j <= N * M; j ++) if(visy[j]) B[j] += slack; }for(i = 1; i <= N; i ++) ans += MAX - G[i][xM[i]];printf("%.6f\n", (double)ans / N); } int main() {int t;scanf("%d", &t);while(t --){init();solve(); }return 0; }
转载于:https://www.cnblogs.com/staginner/archive/2012/08/18/2645729.html
POJ 3686 The Windy's相关推荐
- poj 3686 The Windy's( KM算法 )
恩 , 题是好题 , 一道经典KM算法题 , 只是刚开始读错题了,感觉思路没错但就是过不了样例,受不了了就上网查了一下题意,果然题意理解错了 ,改了一下输入,又加了个标记数组就这样的过了~ 唉,由此 ...
- poj pku图论、网络流入门题总结、汇总
poj pku图论.网络流入门题总结.汇总 分类: acm图论 2010-08-25 18:49 243人阅读 评论(0) 收藏 举报 网络算法networkgraphconstructioninte ...
- POJ 图论分类 + DP(较全 自己又加了点)
DP -----------动态规划 状态压缩DP 2411 (棋盘规模较大)状态压缩DP+DFS+滚动数组 2664 (棋盘规模较小)直接递推即可(DP) 2506 (棋盘规模较小)直接递推即可(D ...
- anaconda+python3.7+win10安装dlib_Windows系统下 Python(Anaconda)的 Dlib库 的安装
0. 引言 介绍在 Windows 操作系统下,在 Python 的 Anaconda 集成环境中,安装 Dlib 库 : 对于不了解源码编译的,或者利用 cmake 方法失败的,可以尝试下此方法: ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- 【HDOJ图论题集】【转】
1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...
- 一系列图论问题[转]
=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...
- 图论练习题(存起来练)
=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Man ...
- ACM比赛经验、刷题记录及模板库总结(更新中)
前言 本文所提及的部分题目代码,可以在我的Github上找到 第一部分 经验分享及感受 第二部分 刷题记录 一.基础算法&程序语言 //strlen()函数的复杂度是O(n)要小心 //截取字 ...
最新文章
- VS2010去掉每次全部编译
- c++ 遍历list_数据结构之图的遍历,一篇文章get全部考点
- 【网络安全】SQL注入bypass最新版安全狗
- java中在做除法操作时,对有余数的结果进行取整
- 关于“指针的指针”的认识(值传递、指针传递区分)
- 关于主机的思维导图_读《思维导图》系列丛书----我用思维导图做什么?
- SAP成都研究院大卫哥:SAP C4C中国本地化之微信小程序集成
- hdfoo站点开发笔记
- 地理知识归纳:影响降水的九大因素
- 深入 JavaScript(4) - new运算符是如何工作的
- python爬虫爬微信红包_python 微信红包
- Day09: socket网络编程-OSI七层协议,tcp/udp套接字,tcp粘包问题,socketserver
- 大数据之-Hadoop伪分布式_启动YARN并运行MR程序---大数据之hadoop工作笔记0026
- 工作两年和研究生两年(专业硕士)有什么差异?
- Ultimaker Cura集成了HP 3D扫描软件
- 利用重抽样获取mgcv包的广义可加模型函数曲线的可信区间(3)
- 《第五项修炼》读书笔记
- 哔咔漫画无响应,无法安装正确的应用
- python屏幕文字识别_python 图片文字识别 可截图识别
- MYSQL索引原理,优化SQL
热门文章
- python时间序列分析航空旅人_时间序列分析-ARIMA模型(python)
- python实用性函数分享_分享|3个开源的 Python Shell
- android 游戏现状,年终总结:Android十款画面最强3D游戏
- 12面魔方公式图解法_【高级篇】(三)三阶魔方CFOP高级玩法之——F2L
- 兼容软件多的linux,现在有多少种同Linux系统兼容的软件?
- php 获取对象中的元素个数组长度,php数组长度怎么获取
- 产品经理 需求 项目经理 选择_产品经理和项目经理的区别
- C++知识点54——RTTI(运行时类型识别)
- 9.QT事件机制源码时序分析(上)
- 11年瑞纳手动挡值多少钱_三分钟让你知道手中的松石值多少钱