ZOJ1655 Transport Goods(Floyd)
利用Floyd的DP状态转移方程。
1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include<algorithm> 5 using namespace std; 6 #define MAXN 111 7 int n,m; 8 double d[MAXN][MAXN]; 9 void Floyd() { 10 for(int k=1; k<=n; ++k) { 11 for(int i=1; i<=n; ++i) { 12 for(int j=1; j<=n; ++j) { 13 if(d[i][k]==0 || d[k][j]==0) continue; 14 d[i][j]=max(d[i][j],d[i][k]*d[k][j]); 15 } 16 } 17 } 18 } 19 int main() { 20 int a,b,goods[MAXN]; 21 double c; 22 while(~scanf("%d%d",&n,&m)) { 23 memset(d,0,sizeof(d)); 24 for(int i=1; i<n; ++i) { 25 scanf("%d",goods+i); 26 } 27 for(int i=0; i<m; ++i) { 28 scanf("%d%d%lf",&a,&b,&c); 29 d[b][a]=d[a][b]=max(d[a][b],1-c); 30 } 31 Floyd(); 32 double res=0; 33 for(int i=1; i<n; ++i) { 34 res+=goods[i]*d[i][n]; 35 } 36 printf("%.2f\n",res); 37 } 38 return 0; 39 }