利用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 }

 

相关文章:

  • 2021-11-20
  • 2022-12-23
  • 2022-12-23
  • 2021-07-20
  • 2021-10-05
  • 2021-11-11
  • 2022-12-23
  • 2021-08-26
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-02-11
  • 2021-09-13
  • 2021-08-11
  • 2022-12-23
  • 2021-07-25
相关资源
相似解决方案