Farmer John always wants his cows to have enough water and thus has made a map of the N (1 <= N <= 700) water pipes on the farm that connect the well to the barn. He was surprised to find a wild mess of different size pipes connected in an apparently haphazard way. He wants to calculate the flow through the pipes.node
Two pipes connected in a row allow water flow that is the minimum of the values of the two pipe's flow values. The example of a pipe with flow capacity 5 connecting to a pipe of flow capacity 3 can be reduced logically to a single pipe of flow capacity 3:網絡
+---5---+---3---+ -> +---3---+app
Similarly, pipes in parallel let through water that is the sum of their flow capacities:ide
+---5---+this
---+ +--- -> +---8---+idea
+---3---+spa
Finally, a pipe that connects to nothing else can be removed; it contributes no flow to the final overall capacity:code
+---5---+blog
---+ -> +---3---+ip
+---3---+--
All the pipes in the many mazes of plumbing can be reduced using these ideas into a single total flow capacity.
Given a map of the pipes, determine the flow capacity between the well (A) and the barn (Z).
Consider this example where node names are labeled with letters:
+-----------6-----------+
A+---3---+B +Z
+---3---+---5---+---4---+
C D
Pipe BC and CD can be combined:
+-----------6-----------+
A+---3---+B +Z
+-----3-----+-----4-----+
D Then BD and DZ can be combined:
+-----------6-----------+
A+---3---+B +Z
+-----------3-----------+
Then two legs of BZ can be combined:
B A+---3---+---9---+Z
Then AB and BZ can be combined to yield a net capacity of 3:
A+---3---+Z
Write a program to read in a set of pipes described as two endpoints and then calculate the net flow capacity from 'A' to 'Z'. All
networks in the test data can be reduced using the rules here.
Pipe i connects two different nodes a_i and b_i (a_i in range
'A-Za-z'; b_i in range 'A-Za-z') and has flow F_i (1 <= F_i <= 1,000). Note that lower- and upper-case node names are intended to be treated as different.
The system will provide extra test case feedback for your first 50 submissions.
約翰總但願他的奶牛有足夠的水喝,所以他找來了農場的水管地圖,想算算牛棚獲得的水的 總流量.農場裏一共有N根水管.約翰發現水管網絡混亂不堪,他試圖對其進行簡 化.他簡化的方式是這樣的:
兩根水管串聯,則能夠用較小流量的那根水管代替總流量.
兩根水管並聯,則能夠用流量爲兩根水管流量和的一根水管代替它們
固然,若是存在一根水管一端什麼也沒有鏈接,能夠將它移除.
請寫個程序算出從水井A到牛棚Z的總流量.數據保證全部輸入的水管網絡均可以用上述方法 簡化.
輸入格式:
Line 1: A single integer: N
輸出格式:
5 A B 3 B C 3 C D 5 D Z 4 B Z 6
3
1 #include<cstdio> 2 #include<cstring> 3 #define inf 100000000 4 int n,s,t,tw; 5 int a,b,c; 6 char ch[3],cn[3]; 7 int h[300],hs=1; 8 struct edge{int s,n,w;}e[60000]; 9 int d[300],q[300],head,tail; 10 inline int min(int x,int y){return x<y?x:y;} 11 void bfs(){ 12 memset(d,0,sizeof(d)); 13 head=tail=0; 14 d[s]=1,q[head++]=s; 15 while(head>tail){ 16 a=q[tail++]; 17 for(int i=h[a];i;i=e[i].n) 18 if(!d[e[i].s]&&e[i].w){ 19 d[e[i].s]=d[a]+1; 20 if(e[i].s==t) return; 21 q[head++]=e[i].s; 22 } 23 } 24 } 25 int ap(int k,int w){ 26 if(k==t) return w; 27 int uw=w; 28 for(int i=h[k];i&&uw;i=e[i].n) 29 if(e[i].w&&d[e[i].s]==d[k]+1){ 30 int wt=ap(e[i].s,min(uw,e[i].w)); 31 if(wt) e[i].w-=wt,e[i^1].w+=wt,uw-=wt; 32 else d[e[i].s]=0; 33 } 34 return w-uw; 35 } 36 bool Dinic(){ 37 bfs(); 38 if(!d[t]) return 0; 39 tw+=ap(s,inf); 40 return 1; 41 } 42 int main(){ 43 scanf("%d",&n); 44 s='A',t='Z'; 45 while(n--){ 46 scanf("%s%s%d",ch,cn,&c); 47 a=ch[0],b=cn[0]; 48 e[++hs]=(edge){b,h[a],c},h[a]=hs; 49 e[++hs]=(edge){a,h[b],c},h[b]=hs; 50 } 51 while(Dinic()); 52 printf("%d\n",tw); 53 return 0; 54 }
我終於能順手的,順手A了,網絡流真心好實現。
題目來源:洛谷