hunnu 11545小明的煩惱——找路徑 (最大流)
阿新 • • 發佈:2017-07-03
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 |
小明真的是個非常厲害的人,每當老師有什麽事時,總是會找到小明,二小明也總能解決,所以老師決定給小明一個獎勵,給他額外的假期。小明當然非常高興。由於小明最終能夠如願的出去旅遊了。小明旅遊的第一站到了漂亮的長沙,到了長沙當然免不了要去參觀古色古香的的湖南師範大學了。小明在師大校園裏愉快的玩耍。不時瞅一眼從他身邊經過的美女,也感嘆這個校園古老建築帶給他的震撼。 臨近中午了。小明走到了理學院大門前,瞬間就被吸引了,於是就走了進去,在理學院的一個教室外面。小明看到有個帶眼睛的男生在皺眉頭,好像是被什麽難題卡住了,小明的慈悲之心油然而生,於是就走了進去。 於是題目就來了:
|
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小明的煩惱——找路徑 (最大流)