24h購物| | PChome| 登入
2011-06-16 18:05:21| 人氣873| 回應0 | 上一篇 | 下一篇

d760. 10330 - Power Transmission

推薦 0 收藏 0 轉貼0 訂閱站台

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

內容 :

DESA正在進行一項電力傳輸的計畫。在 Barisal 這個地方新建了一座發電廠,它的主要目的是提供電力給 Dhaka這座城市。由於 Dhaka 的人口數相當多,DESA 希望盡可能透過網路傳輸最大的電力給它。但是電力在傳輸時會因電阻而損失,所以他們想要使用變電裝置來達到不損失電力的目標。

每個變電裝置有不同的容量。這指的是假如一個變電裝置得到100單位的電,而它的容量只有80個單位,那麼就會損失20單位的電。並且 連接變電裝置之間的電線也是有一定的容量的,例如容量20單位的電線無法傳輸超過20單位的電。DESA 想要知道在沒有電力損失的情況下,最多可以傳輸的電力是多少。這就是你的任務。

輸入說明 :

輸入含有多組測試資料。

每組測試資料的第一列,有 1 個正整數 N(1 <= N <= 100)代表變電裝置的數目(編號 1 到 N)。下一列有 N 個正整數代表這N個變電裝置的容量。接下來的一列有一個正整數 M,代表各變電裝置間連接電線的數目。再接下來的 M 列每列有3個正整數(i j C)。i, j 為變電裝置的編號,C 為連接 i, j 的電線的容量。電力能夠從 i 變電裝置傳輸到 j 變電裝置。再接下來的一列有2個整數B,D。B代表直接連接發電廠的變電裝置的數目,D代表直接連接到Dhaka的變電裝置的數目。這些連接的電線是特別的,他們的容量是無限大(上圖以藍粗線表示)。下一列有B+D個變電裝置的編號,前B個代表直接連接Barisal發電廠的變電裝置編號,剩下的D個為直接連接到Dhaka的變電裝置的編號。連接Barisal的變電裝置不會連接到Dhaka。

輸出說明 :

對每一組測試資料輸出一列,最多可以從Barisal傳送多少電力到Dhaka。

範例輸入 :

410 20 30 4061 2 51 3 101 4 132 3 52 4 73 4 203 11 2 3 4250 10011 2 1001 11 2

範例輸出 :

3750

提示 :

※Luckycat譯。

出處 :

10330 - Power Transmission (管理:asas)



作法 : max flow
這是我第一次寫這個,所以亂寫
由於點有容量,所以把點拆掉,
每次找一條,有容量可以到達終點的路徑,並回朔將路徑上的權值,都扣掉這個容量
找一條我用了SPFA,來完成
直到沒有容量可以再次抵達終點

/**********************************************************************************/
/*  Problem: d760 "10330 - Power Transmission" from 10330 - Power Transmission    */
/*  Language: C                                                                   */
/*  Result: AC (6ms, 438KB) on ZeroJudge                                          */
/*  Author: morris1028 at 2011-06-15 21:56:07                                     */
/**********************************************************************************/


#include<stdio.h>
#define MaxV 10000000
#define MinV 0
int Map[205][205];
int max_flow(int st, int ed, int n) {
    int maxflow = 0, tn , tw;
    int pre[205], V[205], a, b;
    int Q[50000], Qt;
    while(1) {
        int Used[205] = {};
        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 = 0; 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) {
        st = 0, ed = 2*n + 1;
        for(a = 0; a <= ed; a++)
            for(b = 0; b <= ed; b++)
                Map[a][b] = 0;
        for(a = 1; a <= n; a++) {
            scanf("%d", &v);
            Map[a][a+n] = v;
        }
        scanf("%d", &m);
        for(a = 0; a < m; a++) {
            scanf("%d %d %d", &x, &y, &v);
            if(x == y) continue;
            Map[x+n][y] += v;
        }
        scanf("%d %d", &x, &y);
        for(a = 0; a < x; a++) {
            scanf("%d", &v);
            Map[st][v] = MaxV;
        }
        for(a = 0; a < y; a++) {
            scanf("%d", &v);
            Map[v+n][ed] = MaxV;
        }
        printf("%d\n", max_flow(st, ed, ed+1));
    }
    return 0;
}

台長: Morris
人氣(873) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 不分類 | 個人分類: UVA |
此分類下一篇:d667. 820 - Internet Bandwidth
此分類上一篇:d347. 847 - A Multiplication Game

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文