程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 3549 Flow Problem 網絡最大流問題 Edmonds_Karp算法

HDU 3549 Flow Problem 網絡最大流問題 Edmonds_Karp算法

編輯:C++入門知識

HDU 3549 Flow Problem 網絡最大流問題 Edmonds_Karp算法


 

 

Flow Problem

Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 8218 Accepted Submission(s): 3824



Problem Description Network flow is a well-known difficult problem for ACMers. Given a graph, your task is to find out the maximum flow for the weighted directed graph.
Input The first line of input contains an integer T, denoting the number of test cases.
For each test case, the first line contains two integers N and M, denoting the number of vertexes and edges in the graph. (2 <= N <= 15, 0 <= M <= 1000)
Next M lines, each line contains three integers X, Y and C, there is an edge from X to Y and the capacity of it is C. (1 <= X, Y <= N, 1 <= C <= 1000)
Output For each test cases, you should output the maximum flow from source 1 to sink N.
Sample Input
2
3 2
1 2 1
2 3 1
3 3
1 2 1
2 3 1
1 3 1

Sample Output
Case 1: 1
Case 2: 2

Author HyperHexagon
Source HyperHexagon's Summer Gift (Original tasks)
題意:

 

純求網絡最大流,用EK算法就可以實現。

 

代碼:

 

#include 
#include 
#include 
#include 
using namespace std;

#define maxn 20
#define INF 0x3f3f3f3f
int ans, s, t, n;
int a[maxn], pre[maxn];
int flow[maxn][maxn];
int cap[maxn][maxn];

void Edmonds_Karp()
{
    queue q;
    memset(flow, 0, sizeof(flow));
    ans = 0;
    while(1)
    {
        memset(a, 0, sizeof(a));
        a[s] = INF;
        q.push(s);
        while(!q.empty())   //bfs找增光路徑
        {

            int u = q.front();
            q.pop();
            for(int v = 1; v <= n; v++)
                if(!a[v] && cap[u][v] > flow[u][v])
                {
                    pre[v] = u;
                    q.push(v);
                    a[v] = min(a[u], cap[u][v]-flow[u][v]);
                }
        }
        if(a[t] == 0) break;
        for(int u = t; u != s; u = pre[u])  //改進網絡流
        {
            flow[pre[u]][u] += a[t];
            flow[u][pre[u]] -= a[t];
        }
        ans += a[t];
    }
}

int main()
{
    //freopen(hdu_3549.txt, r, stdin);
    int T, m, u, v, c;
    scanf(%d, &T);
    for(int cas = 1; cas <= T; cas++)
    {
        scanf(%d%d, &n, &m);
        memset(cap, 0, sizeof(cap));
        while(m--)
        {
            scanf(%d%d%d, &u, &v, &c);
            cap[u][v] += c;
        }
        s = 1, t = n;
        Edmonds_Karp();
        printf(Case %d: %d
, cas, ans);
    }
    return 0;
}


 

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved