题意:1号点为首都,其他点上都有物资,每经过一条边都会有一个损耗比,问最多多少物资能运到首都
题解: 最短路,求消耗比例最少的从首都到其他城市的路,然后sigma w[k]*rate[1][k] k>1 k<=n即可
#include<bits/stdc++.h>
#define w second
#define y first
using namespace std;
const int MAXN=200;
int n,m;
typedef pair<int ,double>pii;
double d[MAXN],f[MAXN];
vector<pii>a[MAXN];
void spfa()
{
bool vis[MAXN]={0};
queue<int>q;
memset(d,0,sizeof(d));
d[n]=1.0;
vis[n]=true;
q.push(n);
while (!q.empty())
{
int h=q.front();
q.pop();
for (int i=0;i<a[h].size();i++)
{
if (d[h]*a[h][i].w>d[a[h][i].y])
{
d[a[h][i].y]=d[h]*a[h][i].w;
if (!vis[a[h][i].y])
{
q.push(a[h][i].y);
vis[a[h][i].y]=true;
}
}
}
vis[h]=false;
}
}
void Gao()
{
for (int i=1;i<=n;i++)
a[i].clear();
for (int i=1;i<n;i++)
scanf("%lf",f+i);
for (int i=0;i<m;i++)
{
int xx,yy;
double zz;
scanf("%d%d%lf",&xx,&yy,&zz);
double rate=1.0-zz;
a[xx].push_back(make_pair(yy,rate));
a[yy].push_back(make_pair(xx,rate));
}
spfa();
double ans=0.0;
for (int i=1;i<n;i++)
ans+=f[i]*d[i];
printf("%.2lf\n",ans);
}
int main()
{
//freopen("a.in","r",stdin);
while (cin>>n>>m)
Gao();
return 0;
}