poj3686 The Windy's KM算法
2015-01-27 12:22
435 查看
题意:
有n个订单,m个机器。每个机器同时只能处理一个订单,问最小的平均时间是多少。平均时间=总时间/订单数。
总时间是等待的时间加上处理的时间。
思路:
对于一个机器,假如有k个订单要处理,则总时间为t1 + (t1 + t2) + (t1 + t2 + t2) + ... + (t1 + t2 + t3 + ... + tk)。所以,对于一个订单,假设它倒数第i个被处理,则总时间增加i * ti。
建图:
for (int i = 1; i <= n; i++) { int cnt = 0; for (int j = 1; j <= m; j++) { scanf("%d", &t); for (int k = 1; k <= n; k++) // 表示订单i在机器j上倒数第k个被处理 edges[i][++cnt] = t * k; } }
代码走(1212K,47MS):
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #define INF 0x7fffffff using namespace std; int n, m; int cntA, cntB; int edges[55][2505]; int A[55], B[2505]; bool visA[55], visB[2505]; int mat[2505]; int d; bool dfs(int i) { visA[i] = 1; for (int j = 1; j <= n * m; j++) { if (!visB[j]) { int t = edges[i][j] - A[i] - B[j]; if (!t) { visB[j] = 1; if (!mat[j] || dfs(mat[j])) { mat[j] = i; return true; } } else d = min(d, t); } } return false; } int match() { memset(B, 0, sizeof(B)); for (int i = 1; i <= n; i++) { A[i] = INF; for (int j = 1; j <= n * m; j++) A[i] = min(A[i], edges[i][j]); } memset(mat, 0, sizeof(mat)); for (int i = 1; i <= n; i++) { while (true) { memset(visA, 0, sizeof(visA)); memset(visB, 0, sizeof(visB)); d = INF; if (dfs(i)) break; for (int j = 1; j <= n; j++) if (visA[j]) A[j] += d; for (int j = 1; j <= n * m; j++) if (visB[j]) B[j] -= d; } } int ans = 0; for (int i = 1; i <= n * m; i++) ans += edges[mat[i]][i]; return ans; } int main() { int cas; scanf("%d", &cas); while (cas--) { scanf("%d %d", &n, &m); int t; for (int i = 1; i <= n; i++) { int cnt = 0; for (int j = 1; j <= m; j++) { scanf("%d", &t); for (int k = 1; k <= n; k++) edges[i][++cnt] = t * k; } } int ans = match(); printf("%.6f\n", 1.0 * ans / n); } return 0; }
相关文章推荐
- POJ3686 The Windy's
- poj 3686 The Windy's(最小费用最大流)
- [ACM] POJ 3686 The Windy's (二分图最小权匹配,KM算法,特殊建图)
- poj 3686 The Windy's(最小权值和)
- POJ 3686 The Windy's 指派问题 拆点
- POJ 3686 The Windy's KM算法
- poj 3686 The Windy's 二分图最小权和匹配KM
- The Windy's (poj 3686 最小费用最大流 建图经典)
- 【POJ 3686】The Windy's(KM算法)
- The Windy's - POJ 3686 KM算法
- 解题报告 之 POJ3686 The Windy's
- POJ 3686 The Windy's & HDU 3718 Similarity
- poj 3686 The Windy's 二分匹配 KM算法求最小权匹配
- POJ_3686_The Windy's(最小费用流)
- [转] How to install the glut libraries and dll's into windows
- The COM Programmer's Cookbook
- Bad WML syntax. 'Fatal Error. Ln 1, Col 1 The main XML document cannot be empty'.
- "An extender can't be in a different UpdatePanel than the control it extends." error really needs debugging information ,错误
- PNG: The Definitive Guide (O'Reilly Nutshell)
- WAP中的'Fatal Error. Ln 1, Col 1 The main XML document cannot be empty'