HDU 3549 Flow Problem [网络流]
来源:互联网 发布:南昌工程学院网络 编辑:程序博客网 时间:2024/04/30 18:42
http://acm.hdu.edu.cn/showproblem.php?pid=3549
Description
最大流问题
Algorithm
V1.0
EdmondsKarp算法
翻译了佳佳写的类,目前不是太懂
V2.0
FordFulkerson算法
依然不是太懂 不过这个是DFS 而上面那个是BFS
参照佳佳的,把日本哥们的也翻译成了类
V3.0
Dinic算法 摘自《算法竞赛入门经典 训练教程》
Code
V3.0
#include <iostream>#include <cstdio>#include <vector>#include <cstring>#include <climits>#include <queue>using namespace std;const int MAXN = 15 + 9;const int INF = INT_MAX;struct Edge{ int from, to, cap, flow;};int n, s, t;vector<Edge> edges;vector<int> g[MAXN];bool vis[MAXN];int d[MAXN];int cur[MAXN];void addEdge(int from, int to, int cap){ edges.push_back((Edge){from, to, cap, 0}); edges.push_back((Edge){to, from, 0, 0}); int m = edges.size(); g[from].push_back(m - 2); g[to].push_back(m - 1);}bool BFS(){ memset(vis, 0, sizeof(vis)); queue<int> q; q.push(s); d[s] = 0; vis[s] = true; while (!q.empty()) { int x = q.front(); q.pop(); for (int i = 0; i < g[x].size(); i++) { Edge& e = edges[g[x][i]]; if (!vis[e.to] && e.cap > e.flow) { vis[e.to] = true; d[e.to] = d[x] + 1; q.push(e.to); } } } return vis[t];}int DFS(int x, int a){ if (x == t || a == 0) return a; int flow = 0; int f; for (int& i = cur[x]; i < g[x].size(); i++) { Edge& e = edges[g[x][i]]; if (d[x] + 1 == d[e.to] && (f = DFS(e.to, min(a, e.cap - e.flow))) > 0) { e.flow += f; edges[g[x][i]^1].flow -= f; flow += f; a -= f; if (a == 0) break; } } return flow;}int maxFlow(int s, int t){ int flow = 0; while (BFS()) { memset(cur, 0, sizeof(cur)); flow += DFS(s, INF); } return flow;}void solve() { int m; scanf("%d%d", &n, &m); memset(g, 0, sizeof(g)); edges.clear(); for (int i = 0; i < m; i++) { int x, y, c; scanf("%d%d%d", &x, &y, &c); x--; y--; addEdge(x, y, c); } s = 0; t = n - 1; int ans = maxFlow(s, t); printf("%d\n", ans);}int main() { // freopen("in.txt", "r", stdin); int t; scanf("%d", &t); for (int i = 1; i <= t; i++) { printf("Case %d: ", i); solve(); }}
V2.0
C++
#include <iostream>#include <cstdio>#include <vector>#include <cstring>#include <climits>using namespace std;const int MAXN = 15 + 9;const int INF = INT_MAX;struct Edge{ Edge(int a, int b, int c) : to(a), cap(b), rev(c) {} int to, cap, rev;;};vector<Edge> g[MAXN];bool used[MAXN];void addEdge(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 maxFlow(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; }}void solve() { int n, m; scanf("%d%d", &n, &m); memset(g, 0, sizeof(g)); for (int i = 0; i < m; i++) { int x, y, c; scanf("%d%d%d", &x, &y, &c); x--; y--; addEdge(x, y, c); } int ans = maxFlow(0, n - 1); printf("%d\n", ans);}int main() { //freopen("in.txt", "r", stdin); int t; scanf("%d", &t); for (int i = 1; i <= t; i++) { printf("Case %d: ", i); solve(); }}
JAVA
import java.util.ArrayList;import java.util.Arrays;import java.util.Scanner;class Edge { int to; // 终点 int cap; // 容量 int rev; // 反向边 Edge(int a, int b, int c) { to = a; cap = b; rev = c; }}class FordFulkerson { final int INF = Integer.MAX_VALUE / 2; boolean[] used; ArrayList[] g; int n; FordFulkerson(int nn) { int n = nn; used = new boolean[n]; g = new ArrayList[n]; for (int i = 0; i < n; i++) { g[i] = new ArrayList(); } } void addEdge(int from, int to, int cap) { g[from].add(new Edge(to, cap, g[to].size())); g[to].add(new 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 = (Edge)g[v].get(i); if (!used[e.to] && e.cap > 0) { int d = dfs(e.to, t, Math.min(f, e.cap)); if (d > 0) { e.cap -= d; ((Edge)g[e.to].get(e.rev)).cap += d; return d; } } } return 0; } int getMaxFlow(int s, int t) { int flow = 0; for (;;) { Arrays.fill(used, false); int f = dfs(s, t, INF); if (f == 0) return flow; flow += f; } }}public class Main { static Scanner cin = new Scanner(System.in); static void solve() { int n = cin.nextInt(); int m = cin.nextInt(); FordFulkerson fordFulkerson = new FordFulkerson(n); for (int i = 0; i < m; i++) { int x = cin.nextInt() - 1; int y = cin.nextInt() - 1; int z = cin.nextInt(); fordFulkerson.addEdge(x, y, z); } System.out.println(fordFulkerson.getMaxFlow(0, n - 1)); } public static void main(String[] args) { int t = cin.nextInt(); for (int i = 1; i <= t; i++) { System.out.printf("Case %d: ", i); solve(); } }}
V1.0
import java.util.ArrayList;import java.util.LinkedList;import java.util.Scanner;class Edge { int from; int to; int cap; //容量 int flow; Edge(int a, int b, int c, int d) { from = a; to = b; cap = c; flow = d; }}class EdmondsKarp { final int INF = Integer.MAX_VALUE / 2; int m; int n; ArrayList edges; ArrayList[] g; int[] a; int[] p; EdmondsKarp(int nn) { n = nn; g = new ArrayList[n]; for (int i = 0; i < n; i++) { g[i] = new ArrayList(); } edges = new ArrayList(); p = new int[n]; } void addEdge(int from, int to, int cap) { edges.add(new Edge(from, to, cap, 0)); edges.add(new Edge(to, from, 0, 0)); m = edges.size(); g[from].add(m - 2); g[to].add(m - 1); } int getMaxFlow(int s, int t) { int flow = 0; for (;;) { a = new int[n]; LinkedList q = new LinkedList(); a[s] = INF; q.add(s); while (!q.isEmpty()) { int x = (int)q.removeFirst(); for (int i = 0; i < g[x].size(); i++) { Edge e = (Edge)edges.get((int)g[x].get(i)); if (a[e.to] == 0 && e.cap > e.flow) { p[e.to] = (int)g[x].get(i); a[e.to] = Math.min(a[x], e.cap - e.flow); q.add(e.to); } } if (a[t] > 0) break; } if (a[t] == 0) break; for (int u = t; u != s; u = ((Edge)edges.get(p[u])).from) { ((Edge)edges.get(p[u])).flow += a[t]; ((Edge)edges.get(p[u]^1)).flow -= a[t]; } flow += a[t]; } return flow; }}public class Main { static final int INF = Integer.MAX_VALUE / 2; static Scanner cin = new Scanner(System.in); static void solve() { int n = cin.nextInt(); int m = cin.nextInt(); EdmondsKarp edmondsKarp = new EdmondsKarp(n); for (int i = 0; i < m; i++) { int x = cin.nextInt() - 1; int y = cin.nextInt() - 1; int c = cin.nextInt(); edmondsKarp.addEdge(x, y, c); } System.out.println(edmondsKarp.getMaxFlow(0, n - 1)); } public static void main(String[] args) { int t = cin.nextInt(); for (int i = 1; i <= t; i++) { System.out.printf("Case %d: ", i); solve(); } }}
0 0
- HDU 3549 Flow Problem 最大网络流
- hdu 3549 最大网络流 Flow Problem
- 网络流 HDU 3549 Flow Problem
- hdu 3549 Flow Problem 网络流
- HDU 3549 Flow Problem [网络流]
- HDU--3549 Flow Problem 网络流
- HDU 3549 Flow Problem 网络流 EK
- HDU 3549Flow Problem(网络流之最大流)
- HDU 3549 Flow Problem(有向边网络流)
- HDU 3549 Flow Problem 网络流 基础题
- Flow Problem hdu 3549 网络流模板题目
- hdu 3549 Flow Problem(网络流增广路径主要算法)
- hdu 3549 Flow Problem(图论:网络流增广路)
- HDU- 3549-Flow Problem (网络流之 EK)
- hdu 3549 Flow Problem ek算法,网络流
- HDU 3549 Flow Problem(网络流模板题)
- hdu 3549 Flow Problem EK算法 网络流
- hdu 3549 Flow Problem(简单网络流Dinic)
- 杭电1330
- redhat5配置本地yum
- 二进制中1的个数的多种解法解析以及完整c语言代码
- eventBus学习
- Android 广播机制
- HDU 3549 Flow Problem [网络流]
- R.java文件介绍
- virtualbox不能安装64位系统
- ASP.NET MVC中给所有的cshtml页面引用命名空间
- iOS7下隐藏statusbar
- 调整数组顺序系列问题
- 查看和删除镜像
- 传感器与LBS
- java学习路线