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
",res);
37     }
38     return 0;
39 }
原文地址:https://www.cnblogs.com/WABoss/p/5090587.html