BZOJ1070 / SCOI2007 修车【网络流/费用流】
来源:互联网 发布:软件项目团队介绍 编辑:程序博客网 时间:2024/05/20 02:53
Description
同一时刻有
Input
第一行有两个
Output
最小平均等待时间,答案精确到小数点后
Solution
我们可以发现每位顾客修车花费的时间只会对他后面修车的人的等待时间造成影响。那么修车工
这样的话可以费用流。这是一个二分图,因为同一个时间同一个修车工只可以修一辆车,所以把每个修车工的每个时间(倒数第几个修车)拆开成很多点,每个点连向一辆车有一定的费用(即修他的费用)。
考虑原点?因为同一个时间同一个修车工只可以修一辆车,那么从
考虑汇点?因为每个车只需要修一次,所以从每辆车到
Code
#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <queue>using namespace std;const int maxn = 50000 + 5;const int INF = 1e9;int edge_num = 1, m, n, S, T, ans = 0, mincost = 0;int hed[maxn], ct[maxn];int t[61][10];struct Edge { int from, to, nxt, c, cost;} edge[maxn * 4];void addedge(int from, int to, int c, int cost){ edge[++edge_num].nxt = hed[from]; edge[edge_num].from = from; edge[edge_num].to = to; hed[from] = edge_num; edge[edge_num].c = c; edge[edge_num].cost = cost;}void adde(int from, int to, int c, int cost){ addedge(from, to, c, cost); addedge(to, from, 0, -cost);}queue<int> q;int inq[maxn], prev[maxn] = {-1}, pree[maxn];bool SPFA(){ memset(ct, 0x3f3f, sizeof(ct)); inq[S] = 1; ct[S] = 0; q.push(S); while (!q.empty()){ int cur = q.front(); q.pop(); for (int i = hed[cur]; i; i = edge[i].nxt){ int to = edge[i].to; if (ct[to] > ct[cur] + edge[i].cost && edge[i].c){ if (!inq[to]){ inq[to] = 1; q.push(to); } ct[to] = ct[cur] + edge[i].cost; prev[to] = cur; pree[to] = i; } } inq[cur] = 0; } if (ct[T] == ct[maxn - 1]) return 0; int flow = INF; for (int cur = T; ~prev[cur]; cur = prev[cur]){ int ed = pree[cur]; flow = min(flow, edge[ed].c); } for (int cur = T; ~prev[cur]; cur = prev[cur]){ int ed = pree[cur]; edge[ed].c -= flow; edge[ed ^ 1].c += flow; } ans += flow; mincost += flow * ct[T]; return 1;}void MinCostMaxFlow(){ while (SPFA());}int main(){ scanf("%d%d", &n, &m); for (int i = 1; i <= m; i++) for (int j = 1; j <= n; j++) scanf("%d", &t[i][j]); S = 0, T = 1001; for(int i = 1; i <= n * m; i++) adde(S, i, 1, 0); for(int i = n * m + 1; i <= n * m + m; i++) adde(i, T, 1, 0); for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) for(int k = 1; k <= m; k++) adde((i - 1) * m + j, n * m + k, 1, t[k][i] * j); MinCostMaxFlow(); printf("%.2f\n", (double)mincost / m); return 0;}
阅读全文
0 0
- BZOJ1070 / SCOI2007 修车【网络流/费用流】
- bzoj1070: [SCOI2007]修车 费用流
- [BZOJ1070]SCOI2007修车|费用流
- bzoj1070[SCOI2007]修车(费用流)
- bzoj1070: [SCOI2007]修车-费用流
- [费用流] BZOJ1070: [SCOI2007]修车
- [bzoj1070][SCOI2007]修车 费用流
- 【bzoj1070】[SCOI2007]修车 网络流
- [BZOJ1070][SCOI2007]修车(费用流)
- [BZOJ1070][SCOI2007]修车-最小费用流
- 【最小费用最大流】BZOJ1070 [SCOI2007]修车
- bzoj1070 [SCOI2007]修车(费用流)
- 【费用流Spfa增广】BZOJ1070(SCOI2007)[修车]题解
- bzoj1070: [SCOI2007]修车(最小费用最大流)
- 【费用流】[BZOJ1070]/[HYSBZ1070]修车
- 【BZOJ1070】【codevs2436】修车,费用流
- bzoj1070 修车 最小费用流
- 【网络流】【费用流】[SCOI2007]修车
- python核心编程系列-1
- 【编程之美】读书笔记:寻找最大的K个数
- JS截取字符串常用方法详细整理
- java利用链栈实现大数加法问题
- 【1017】数列
- BZOJ1070 / SCOI2007 修车【网络流/费用流】
- hdu 2883 kebab (最大流 + 建图)
- 改变边框线条与背景重叠的布局
- Hero鹏——只为挖坑而生
- Github使用教程
- 设计模式--观察者模式
- 操作符
- Android的自定义View及View的绘制流程
- Java聊天