- 一本通传送门
- 这道是Dijkastra的例题,大致思路依然是
初始化——找顶点——标记,更新
- 有一个小细节,最后的结果计算的是A需要多少钱,所以在预处理时要把a数组转换为100/x的形式,最后输出再转回来。
- 所以要选值最大的一条路,才能保证花费最少。
- 上代码!
#include<bits/stdc++.h>
using namespace std;
double a[2001][2001],d[2001],maxn;
int n,m,x,y,k,f[2001];
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y,z;
cin>>x>>y>>z;
a[x][y]=a[y][x]=(100-z)/100.0;
}
cin>>x>>y;
for(int i=1;i<=n;i++) d[i]=a[x][i];
d[x]=1,f[x]=1;
for(int i=1;i<n;i++){
maxn=0;
for(int j=1;j<=n;j++)
if(f[j]==0&&d[j]>maxn)
k=j,maxn=d[j];
f[k]=1;
if(k==y) break;
for(int j=1;j<=n;j++)
if(f[j]==0&&d[k]*a[k][j]>d[j])
d[j]=d[k]*a[k][j];
}
printf("%0.8lf",100/d[y]);
return 0;
}