思路
dij算法
代码
#include<cstdio>
#include<cstring>
#include<cmath>
#define INF 1e30
#define r(i,a,b) for (int i=a;i<=b;i++)
using namespace std;int n,c,d,now,m,ans=0,p;
double l[2001][2001]={0},minn;
int x,y;
double f[2001]={0};bool v[2001];
double min(double x,double y){return x<y?x:y;}
double max(double x,double y){return x>y?x:y;}
void read(int &f)//输入流
{
f=0;char c;bool d=0;
while (c=getchar(),c<'0'||c>'9') if (c=='-') d=1;f=f*10+c-48;
while (c=getchar(),c>='0'&&c<='9') f=f*10+c-48;
if (d) f*=-1;
}
void LRZ()
{
read(n);read(m);
r(i,1,m)
{
read(x);read(y);
scanf("%lf",&l[x][y]);
l[y][x]=l[x][y]=(100-l[x][y])/100;//双向汇款
}read(c);read(d);//第c个人转给第d个人
}
void work()
{
r(i,1,n)
f[i]=l[c][i];v[c]=true;f[c]=1;//舒适化
r(i,1,n-1)
{
minn=0;
r(j,1,n)
if (!v[j]&&f[j]>minn) p=j,minn=f[j];//找到最小值
v[p]=true;//标记
if(p==d) break;//如果已经汇到了,直接退出
r(j,1,n)
if (!v[j]&&l[p][j]*f[p]>f[j])f[j]=l[p][j]*f[p];//修正
}
}
void print()
{
printf("%0.8lf",100/f[d]);//输出
}
int main()
{
LRZ();
work();
print();
}