(网络流_最大流)Flow Problem
2015-04-10 21:42
295 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3549
入门题目,纪念。
Ford-Fulkerson做法:
Dinic做法:
入门题目,纪念。
Ford-Fulkerson做法:
#include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <algorithm> using namespace std; const int maxn = 25; typedef long long LL; const int INF = 0xfffffff; struct edge { int to, cap, rev; edge(int to, int cap, int rev) :to(to), cap(cap), rev(rev){} }; vector<edge> G[maxn]; bool used[maxn]; void add_edge(int from, int to, int cap) { G[from].push_back(edge( to, cap, G[to].size() )); G[to].push_back(edge( from, 0, G[from].size() - 1 )); } int dfs(int v, int t, int f) { if (v == t) return f; used[v] = true; for (int i = 0; i < G[v].size(); i++) { edge &e = G[v][i]; if (!used[e.to] && e.cap>0) { int d = dfs(e.to, t, min(f, e.cap)); if (d > 0) { e.cap -= d; G[e.to][e.rev].cap += d; return d; } } } return 0; } int max_flow(int s, int t) { int flow = 0; for (;;) { memset(used, 0, sizeof(used)); int f = dfs(s, t, INF); if (f == 0) return flow; flow += f; } } int main() { //freopen("f:\\input.txt", "r", stdin); int T; int cas = 0; scanf("%d", &T); while (T--) { int n, m; scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) G[i].clear(); for (int i = 0; i < m; i++) { int from, to, cap; scanf("%d%d%d", &from, &to, &cap); add_edge(from, to, cap); } printf("Case %d: %d\n", ++cas, max_flow(1, n)); } return 0; }
Dinic做法:
#include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <queue> #include <algorithm> using namespace std; const int maxn = 25; typedef long long LL; const int INF = 0xfffffff; ////////////////////////最大流开始////////////////////////////////////// typedef int cap_type; #define MAX_V 20 // 用于表示边的结构体(终点、容量、反向边) struct edge { int to, rev; cap_type cap; edge(int to, cap_type cap, int rev) : to(to), cap(cap), rev(rev) {} }; vector <edge> G[MAX_V]; // 图的邻接表表示 int level[MAX_V]; // 顶点到源点的距离标号 int iter[MAX_V]; // 当前弧,在其之前的边已经没有用了 // 向图中加入一条从from到to的容量为cap的边 void add_edge(int from, int to, int cap) { G[from].push_back(edge(to, cap, G[to].size())); G[to].push_back(edge(from, 0, G[from].size() - 1)); } // 通过BFS计算从源点出发的距离标号 void bfs(int s) { memset(level, -1, sizeof(level)); queue<int> que; level[s] = 0; que.push(s); while (!que.empty()) { int v = que.front(); que.pop(); for (int i = 0; i < G[v].size(); ++i) { edge &e = G[v][i]; if (e.cap > 0 && level[e.to] < 0) { level[e.to] = level[v] + 1; que.push(e.to); } } } } // 通过DFS寻找增广路 cap_type dfs(int v, int t, cap_type f) { if (v == t) { return f; } for (int &i = iter[v]; i < G[v].size(); ++i) { edge &e = G[v][i]; if (e.cap > 0 && level[v] < level[e.to]) { cap_type d = dfs(e.to, t, min(f, e.cap)); if (d > 0) { e.cap -= d; G[e.to][e.rev].cap += d; return d; } } } return 0; } // 求解从s到t的最大流 cap_type max_flow(int s, int t) { cap_type flow = 0; for (;;) { bfs(s); if (level[t] < 0) { return flow; } memset(iter, 0, sizeof(iter)); cap_type f; while ((f = dfs(s, t, 0x3f3f3f3f3f3f3f3f)) > 0) { flow += f; } } } ///////////////////////////////最大流结束///////////////////////////////////// int main() { //freopen("f:\\input.txt", "r", stdin); int T; int cas = 0; scanf("%d", &T); while (T--) { int n, m; scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) G[i].clear(); for (int i = 0; i < m; i++) { int from, to, cap; scanf("%d%d%d", &from, &to, &cap); add_edge(from, to, cap); } printf("Case %d: %d\n", ++cas, max_flow(1, n)); } return 0; }
相关文章推荐
- Geeks Ford-Fulkerson Algorithm for Maximum Flow Problem 最大网络流问题
- UVAlive 7037 - The Problem Needs 3D Arrays(网络流‘最大密度子图)
- A simple Gaussian elimination problem.(hdu4975)网络流+最大流
- HDU 3549 适合网络流入门(内含sap模板和Dinic模板)Flow Problem
- A simple Gaussian elimination problem.(hdu4975)网络流+最大流
- hdu Flow Problem (最大流 裸题)
- hdoj&nbsp;3549&nbsp;Flow&nbsp;Problem(网络流&nbsp;E…
- POJ3041 二分图最大匹配(网络流算法)
- 网络流刷题记录-最大流
- 网络流(最大流)CodeForces 512C:Fox And Dinner
- 【线段树】【树】【网络流】[UOJ#77]A+B Problem
- 二分图带权最大独立集 网络流解决 hdu 1569
- [HIHO119]网络流五·最大权闭合子图(最大流)
- 【hihocoder 1424】 Asa's Chess Problem(有源汇上下界网络流)
- hdu1532 & pku1273 Drainage Ditches 网络流(最大流EK算法)
- POJ 1087 网络流 最大流
- CODEVS_1034 家园 网络流 最大流
- 二分图的最大匹配——网络流+匈牙利算法
- 网络流最大流除草计划
- HDU 4971 A simple brute force problem.最大权闭合图