uva 10594 Data Flow (最小费最大流+题目给的数据有错)
2015-07-24 16:34
513 查看
uva 10594 Data Flow
题目大意:给出一张图,以及D, K,D代表所要传送的数据量,K代表每条边可以传送的数据量(就是容量),问在可以传送所有数据的前提下,最小耗费时间。
解题思路:建一个超级源点连向源点1,容量为D,然后求该图的最小费最大流。最后将求出的最大流与D比较,比D小输出inpossible,否则输出最小费。
[code]#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <cstdlib> #include <queue> using namespace std; typedef long long ll; const int N = 5005; const ll INF = 1e18; int n, m, s, t; ll K, D; struct Rec{ ll u, v, cos; }rec ; int pre , inq ; ll a , d ; struct Edge{ int from, to; ll cap, flow; ll cos; }; vector<Edge> edges; vector<int> G ; void init() { for (int i = 0; i < N; i++) G[i].clear(); edges.clear(); } void addEdge(int from, int to, ll cap, ll flow, ll cos) { edges.push_back((Edge){from, to, cap, 0, cos}); edges.push_back((Edge){to, from, 0, 0, -cos}); int m = edges.size(); G[from].push_back(m - 2); G[to].push_back(m - 1); } void input() { for (int i = 0; i < m; i++) { scanf("%lld %lld %lld", &rec[i].u, &rec[i].v, &rec[i].cos); } scanf("%lld %lld", &D, &K); for (int i = 0; i < m; i++) { addEdge(rec[i].u, rec[i].v, K, 0, rec[i].cos); addEdge(rec[i].v, rec[i].u, K, 0, rec[i].cos); } addEdge(0, 1, D, 0, 0); } int BF(int s, int t, ll& flow, ll& cost) { queue<int> Q; memset(inq, 0, sizeof(inq)); memset(a, 0, sizeof(a)); memset(pre, 0, sizeof(pre)); for (int i = 0; i <= N; i++) d[i] = INF; d[s] = 0; a[s] = INF; inq[s] = 1; int flag = 1; pre[s] = 0; Q.push(s); while (!Q.empty()) { int u = Q.front(); Q.pop(); inq[u] = 0; for (int i = 0; i < G[u].size(); i++) { Edge &e = edges[G[u][i]]; if (e.cap > e.flow && d[e.to] > d[u] + e.cos) { d[e.to] = d[u] + e.cos; a[e.to] = min(a[u], e.cap - e.flow); pre[e.to] = G[u][i]; if (!inq[e.to]) { inq[e.to] = 1; Q.push(e.to); } } } flag = 0; } if (d[t] == INF) return 0; flow += a[t]; cost += (ll)d[t] * (ll)a[t]; for (int u = t; u != s; u = edges[pre[u]].from) { edges[pre[u]].flow += a[t]; edges[pre[u]^1].flow -= a[t]; } return 1; } int MCMF(int s, int t, ll& cost) { ll flow = 0; cost = 0; while (BF(s, t, flow, cost)); return flow; } int main() { while (scanf("%d %d", &n, &m) == 2) { init(); input(); s = 0, t = n; ll cost; int ans = MCMF(s, t, cost); if (ans < D) printf("Impossible.\n"); else printf("%lld\n", cost); } return 0; }
相关文章推荐
- Codeforces Round #313 (Div. 2) C Gerald's Hexagon 计数
- HTML DOM submit() 方法
- jquery ajax备用
- (转)反转单链表的几种方法
- 统计难题
- Espresso——Android测试工具Espresso简介
- zoj1715
- android布局-GridLayout
- KEIL/IAR 与 Doxygen 快速上手 - 嵌入式编程的注释管理小技巧
- 聊聊并发——HashMap、HashTable及ConcurrentHashMap
- JFinal的设计思想和理念是什么?有哪些创新点?
- 照相机的曝光和白平衡
- Uniyt : 场景LoadLevel时资源和对象的处理流程
- 【暴力搜索】[HDU 1518]Square
- hdu 1080 Human Gene Functions
- 还原数据库出错
- Thymeleaf 学习笔记-实例demo(中文教程)
- 剑指offer-面试题.二叉树的镜像
- hdu 1080 Human Gene Functions
- "Only the original thread that created a view hierarchy can touch its views.” 解决方法