说明:
Dijkstra算法一般用来求单源最短路径,此题需要变化为求单源最大权值的路径,不过思路一样。题意的理解有点麻烦,英语太弱~
//zoj 1655
#include <iostream>
#include <cstdio>
using namespace std;
const int SIZE=101;
int n,m;
double map[SIZE][SIZE];
int val[SIZE];
double dist[SIZE];
void dijkstra(int u0)
{
int S[SIZE];
for(int i=1;i<=n;i++)
{
S[i]=0;
dist[i]=map[u0][i];
if(dist[i]<0) dist[i]=0;
}
S[u0]=1; dist[u0]=1.0;
for(int i=1;i<n;i++)
{
int u=-1;
double maxV=-1;
for(int j=1;j<=n;j++)
if(!S[j] && dist[j]>maxV)
{
maxV=dist[j];
u=j;
}
S[u]=1;
for(int j=1;j<=n;j++)
{
if(!S[j] && map[u][j]>=0 && dist[j]<dist[u]*map[u][j])
dist[j]=dist[u]*map[u][j];
}
}
}
int main()
{
int u,v;
double rate,sum;
while(cin>>n>>m)
{
for(int i=1;i<n;i++) cin>>val[i];
val[n]=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
map[i][j]=-1;
for(int i=0;i<m;i++)
{
cin>>u>>v>>rate;
if(map[u][v]<(1.0-rate))
map[u][v]=map[v][u]=1.0-rate;
}
dijkstra(n);
sum=0;
for(int i=1;i<=n;i++)
sum+=val[i]*dist[i];
printf("%.2f\n",sum);
}
return 0;
}