hdu4280 Island Transport 最大流模板Dinic算法
2015-08-24 10:15
344 查看
题意: 求从最左边的岛到最右边的岛的最大容量
这道题还学会了手动开栈
这道题还学会了手动开栈
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> #include<queue> #pragma comment(linker, "/STACK:1024000000,1024000000")//外挂开栈 using namespace std; const int maxn = 100000 + 5; const int inf = 0x7f7f7f7f; int head[maxn], d[maxn]; int tot; int n, m; struct Eage{ int t, w, next; }eage[maxn*2]; inline void add(int x, int y, int c) { eage[tot].t = y; eage[tot].w += c; eage[tot].next = head[x]; head[x] = tot++; eage[tot].t = x; eage[tot].w += c;//注意这道题的边是双向的! eage[tot].next = head[y]; head[y] = tot++; } bool bfs(int s, int t) { queue<int> q; memset(d, -1, sizeof(d)); d[s] = 0; q.push(s); while (!q.empty()) { int u = q.front(); q.pop(); if (u == t) return true; for (int i = head[u]; i != -1; i = eage[i].next) { int v = eage[i].t; if (d[v] == -1 && eage[i].w > 0)//i写成v调试两个多小时 { d[v] = d[u] + 1; q.push(v); } } } return false; } int dfs(int u, int flow, int t) { if (u == t) return flow; int sum = 0; for (int i = head[u]; i != -1; i = eage[i].next) { int v = eage[i].t; int w = eage[i].w; if (w > 0 && d[v] == d[u]+1) { int tmp = dfs(v, min(flow-sum, eage[i].w), t); eage[i].w -= tmp; eage[i^1].w += tmp; sum += tmp; if (sum == flow) return sum; } } if (sum == 0)d[u] = 0; return sum; } int dinic(int s, int t) { int total = 0; while(bfs(s, t)) { total+=dfs(s, inf, t); } return total; } int main() { //freopen("input.txt", "r", stdin); int t; cin >> t; while (t--) { cin >> n >> m; int s, t, x, y; int Min = inf, Max = -inf; for (int i = 1; i <= n; i++) { scanf("%d%d", &x, &y); if (x < Min) { Min = x; s = i; } if (x > Max) { Max = x; t = i; } } memset(head, -1, sizeof(head)); memset(eage, 0, sizeof(eage)); tot = 0; for (int i = 0; i < m; i++) { int u, v, x; scanf("%d%d%d", &u, &v, &x); add(u, v, x); } int ans = dinic(s, t); printf("%d\n", ans); } return 0; }
相关文章推荐
- 黑马程序员_java基础之面向对象(二)
- Tri Tiling HDU 杭电1143 【规律题】
- 【十二】初探继承
- textbox 和lable换行保存和显示
- Maven常见错误解决
- codeforces 571B--Minimization(贪心+dp)
- linux sed 命令
- 选中多个或全中订单逻辑
- 9.12测试(一)——应用程序一运行就崩溃,且每次崩溃的位置都不一样
- 如何用PS处理虚的照片.使它变的清晰
- MSSQL Server的连接问题分析和解决(1)
- java组合模式
- 循环链表的有趣遍历
- python 语言技巧特点
- Linux内核监控模块-0-开篇简介
- 《转》dbcontext函数
- Linux下Tomcat的启动、关闭、杀死进程
- 如何将ppt或其他文档转为pdf格式
- 2015 H1 DDoS报告:DDoS***呈两极分化
- pyhton学习笔记三重引号编写多行字符串块