1. 程式人生 > >hunnu 11545小明的煩惱——找路徑 (最大流)

hunnu 11545小明的煩惱——找路徑 (最大流)

tro stdio.h class 屬於 max pre 如果 scrip 什麽

小明的煩惱——找路徑
Time Limit: 2000ms, Special Time Limit:5000ms, Memory Limit:32768KB
Total submit users: 45, Accepted users: 37
Problem 11545 : No special judgement
Problem description
小明真的是個非常厲害的人,每當老師有什麽事時,總是會找到小明,二小明也總能解決,所以老師決定給小明一個獎勵,給他額外的假期。小明當然非常高興。由於小明最終能夠如願的出去旅遊了。小明旅遊的第一站到了漂亮的長沙,到了長沙當然免不了要去參觀古色古香的的湖南師範大學了。小明在師大校園裏愉快的玩耍。不時瞅一眼從他身邊經過的美女,也感嘆這個校園古老建築帶給他的震撼。

臨近中午了。小明走到了理學院大門前,瞬間就被吸引了,於是就走了進去,在理學院的一個教室外面。小明看到有個帶眼睛的男生在皺眉頭,好像是被什麽難題卡住了,小明的慈悲之心油然而生,於是就走了進去。

於是題目就來了:
有N個城市,有些城市有道路相連。但這些道路中間並沒有加油站(每一個城市裏面有加油站能夠補給),如今有個project師要找到T條不同的路徑從1號城市到N號城市,兩條路徑是不同的當且僅當不經過同樣的邊。如今告訴你project師的汽車的最大載油量C和經過每條道路所要消耗的油量。問你這個project師能不能完畢任務。

Input
由多組case:
每組case第一行有4個整數N。M。T,C。N<=200;C<=1000000;
然後有M行。每一行有3個整數,a,b,c,代表從a城市到b城市須要c的油量。c<=1000000;假設兩個城市之間有多條邊,則視為不同的邊。
Output
對於每一個case:
假設project師可以完畢任務,輸出YES,不然輸出NO。


Sample Input
7 9 2 5
1 2 2
2 3 5
3 7 5
1 4 1
4 3 1
4 5 7
5 7 1
1 6 3
6 7 3
7 9 2 4
1 2 2
2 3 5
3 7 5
1 4 1
4 3 1
4 5 7
5 7 1
1 6 3
6 7 3
Sample Output
YES
NO
解題:如果每條可行邊的流限最大為1,則依據網絡流的性質:每一個點的 流進量==流出量,守恒。所以一條邊僅僅能屬於一條路。
#include<stdio.h>
#include<string.h>
#include<queue>
#include<iostream>
using namespace std;
const int N = 225;

bool mapt[N][N];
int pre[N],sNode,eNode,n;

bool searchPath(){//找一條增廣路
    queue<int>q;
    bool vist[N]={0};
    pre[sNode]=sNode; vist[sNode]=1;
    q.push(sNode);
    while(!q.empty()){
        int u=q.front(); q.pop();
        for(int v=2; v<=n; v++)
        if(mapt[u][v]&&vist[v]==0){
            vist[v]=1;
            pre[v]=u;
            if(v==eNode) return true;
            q.push(v);
        }
    }
    return false;
}
bool maxflow(int T){
    while(searchPath()){
        int u,v;
        T--;
        if(T<=0)return true;
        v=eNode;
        while(v!=sNode){
            u=pre[v];
            mapt[u][v]=0;
            mapt[v][u]=1;//能夠回流
            v=u;
        }
    }
    return false;
}
int main(){
    int M,T,C,a,b,c;
    while(scanf("%d%d%d%d",&n,&M,&T,&C)>0){
        memset(mapt,false,sizeof(mapt));
        sNode=1; eNode=n;
        while(M--){
            scanf("%d%d%d",&a,&b,&c);
            if(c<=C) mapt[a][b]=1;//每條邊的最大流限。
        }
        if(T==0||maxflow(T))
        printf("YES\n");
        else printf("NO\n");
    }
}


hunnu 11545小明的煩惱——找路徑 (最大流)