2011-06-16 18:08:34Morris

d667. 820 - Internet Bandwidth

http://zerojudge.tw/ShowProblem?problemid=d667

內容 :

在網路上有許多節點,點與點之間有連結,相當於是條網路線,網路線可以是雙向的,但是每條都有同時單秒最大負荷量,不過一個點可以同時對很多其他很多點作傳輸,現在要找出點對點的單秒最大傳輸流量,

例如:  現在要從1為起點傳到4為終點,其最大流量為25,分別路徑為1-2-4 流量10,1-3-4  流量10,1-2-3-4 流量5,加起來共25。

輸入說明 :

有很多筆測資。每一個測資還始會有一個數字代表有幾個節點 n (2 ≤n ≤100),這 n 個節點分別編號為1~n,接下來的那一行會有3個數字s ,t ,c,分別代表起始節點、目標節點及連線數量。接下來的 c 行每行有三個整數,前兩個整數代表所連接的節點,第三個整數則是頻寬,頻寬為一個不大於 1000 的非負整數。

每兩點之間可能有超過2條的連線,但是不會自己連到自己,以及所有連線都是雙向的,最後輸入0代表結束該筆測資。

輸出說明 :

對於每一筆測資,首先印出第幾個網路,然後印出 從 s 傳到 t 的最大頻寬,每一組測試資料後都換一行。

範例輸入 :

41 4 51 2 201 3 102 3 52 4 103 4 200

範例輸出 :

Network 1The bandwidth is 25.

提示 :

出處 :

UVa ACM 820 (管理:snail)



作法 : max flow
找一條容量可以抵達終點的路徑,再回朔扣除邊上的權值
重覆此動作,直到不存在這條路徑

/**********************************************************************************/
/*  Problem: d667 "820 - Internet Bandwidth" from UVa ACM 820                     */
/*  Language: C                                                                   */
/*  Result: AC (26ms, 318KB) on ZeroJudge                                         */
/*  Author: morris1028 at 2011-06-15 22:14:10                                     */
/**********************************************************************************/


#include<stdio.h>
#define MaxV 10000000
#define MinV 0
int Map[101][101];
int max_flow(int st, int ed, int n) {
    int maxflow = 0, tn , tw;
    int pre[101], V[101], a, b;
    int Q[10001], Qt;
    while(1) {
        int Used[101] = {};
        for(a = 0; a <= n; a++)    V[a] = MinV;
        V[st] = MaxV;
        Qt = 0, Q[0] = st, pre[st] = st;
        for(a = 0; a <= Qt; a++) {
            tn = Q[a], Used[tn] = 0;
            for(b = 1; b <= n; b++) {
                tw = (V[tn] < Map[tn][b]) ? V[tn] : Map[tn][b];
                if(tw > V[b]) {
                    V[b] = tw, pre[b] = tn;
                    if(Used[b] == 0)
                        Q[++Qt] = b, Used[b] = 1;
                }
            }
        }
        if(V[ed] == 0) break;
        maxflow += V[ed];
        for(a = ed; a != st; a = pre[a]) {
            Map[pre[a]][a] -= V[ed], Map[a][pre[a]] += V[ed];
        }
    }
    return maxflow;
}
main() {
    int n, m, a, b, v, st, ed, x, y;
    int C = 0;
    while(scanf("%d", &n) == 1 && n) {
        scanf("%d %d %d", &st, &ed, &m);
        for(a = 1; a <= n; a++)
            for(b = 1; b <= n; b++)
                Map[a][b] = 0;
        for(a = 0; a < m; a++) {
            scanf("%d %d %d", &x, &y, &v);
            Map[x][y] += v;
            Map[y][x] += v;
        }
        printf("Network %d\n", ++C);
        printf("The bandwidth is %d.\n\n", max_flow(st, ed, n));
    }
    return 0;
}