計蒜客: 電能傳輸 (Bellman-Ford)
阿新 • • 發佈:2018-12-26
https://nanti.jisuanke.com/t/10772
在嘟嘟生活的王國有 n 座城市,某些城市之間有傳輸電能的線路。在某條線路傳輸電能是會有損耗的,某一個城市在某一時間只可以向另外一個城市傳輸電能。已知在城市 s 存在 m 千瓦時電能,求將這些電能都傳輸到城市 t ,至少需要損耗多少電能。
輸入格式
輸入包含多組測試資料,對於每組測試資料:
第一行包含一個整數 n ( 0 < n ≤ 50000 ) 。
接下來輸入包含 n 部分,對於第 i ( 1 ≤ i ≤ n )部分:第一行包含一個整數 num ( num ≤ 50 ) ,表示城市 i 可以向 num 個城市傳輸電能;接下來 num 行每行包含兩個整數 x y ( 1 ≤ x ≤ n ; x != i ; 0 ≤ y ≤ 100 ) ,表示城市 i 可以向城市 x 傳輸電能,在傳輸時將會損失 y% 的電能。
最後一行包含三個整數 s t m ( 1 ≤ s,t ≤ n ; 1 ≤ m ≤ 1000000 ) 。
輸出格式
對於每組測試資料,如果城市 s 不能向城市 t 傳輸電能,則輸出 "IMPOSSIBLE!" ;否則輸出一個小數,表示損失電能的最小量,結果保留兩位小數。
樣例輸入
5 2 2 20 3 40 2 3 90 4 50 2 2 40 4 90 1 5 80 0 1 5 1000
樣例輸出
920.00
#include<stdio.h> #define N 5000000 double dis[N],w[N]; int u[N],v[N]; int main() { int n,i,j,num,x,y,s,t,m,k,len=0; double min,inf=99999999; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&num); while(num--) { scanf("%d%d",&x,&y); u[len]=i; v[len]=x; w[len]=(100-y)/100.0; len++; } } dis[v[0]]=0; scanf("%d%d%d",&s,&t,&m); for(i=1;i<=n;i++) dis[i]=0; dis[s]=1; for(k=1;k<n;k++) for(i=0;i<len;i++) { if(dis[v[i]]<dis[u[i]]*w[i]) dis[v[i]]=dis[u[i]]*w[i]; } printf("%.2lf\n",m*(1-dis[t])); return 0; }