#include <bits/stdc++.h>
using namespace std;
double g[10001][10001],f[10001],v[10001];
int n,m,x,y,z,s,e;
int main()
{
// Dijkstra :
// 用来计算一个源点到其他所有点的最短路径算法。
// 描述:设起点为s,d[v]表示从s到v的最短路径,p[v]为v的前驱结点,用来输出路径。
// 初始化:d[v]=∞(v!=s);d[s]=0,ps[s]=0;
// for(int i=1;i<=n;i++)
// {
// 1、在没有被访问的点中找到一个顶点,使得d[u]是最小的
// 2、标记u以确定最短路径
// 3、for与u相连的每个未确定最短路径的顶点
// if(d[u]+w[u][v]<d[v])
// {
// d[v]=d[u]+w[u][v];
// p[v]=u;
// }
// }
// d[v]为s到v的最短路径,p[v]为v的前驱节点用来输出路径。
// 解释:从一个点的最短路径一定会经过至少一个中转点
// 如果要求起点到一个点的最短距离,一定先计算出他们中转点的距离。
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>x>>y>>z;
g[x][y]=1.0-z/100.0;
g[y][x]=1.0-z/100.0;
}
cin>>s>>e;
for(int i=1;i<=n;i++)
f[i]=g[s][i];
for(int i=2;i<=n;i++)
{
double a=0;
int t;
for(int j=1;j<=n;j++)
{
if(v[j]!=1&&f[j]>a)
{
a=f[j];
t=j;
}
}
v[t]=1;
for(int j=1;j<=n;j++)
{
if(f[t]*g[t][j]>f[j]&&v[j]==0)
f[j]=f[t]*g[t][j];
}
}
printf("%.8lf",100/f[e]);
return 0;
}
【例4-4】最小花费
最新推荐文章于 2023-08-09 15:40:32 发布