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
原创粉丝点击