提供一个特殊的思路
建好图后,从终点向起点进行bfs搜索,如果发现点的状态可以更新(用当前点可以松弛其他点),则加入队列,更新之。
由于是反向遍历,所以松弛时是➗法
#include <iostream>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=2021;
double g[N][N];//建图过程与y总代码一致
double dist[N];
int n,m;
int rs,re;
void bfs(){
dist[re]=100.0;//初始
queue<int>q;
q.push(re);
while(!q.empty()){
int t=q.front();
q.pop();
for(int i=1;i<=n;i++){
if(g[t][i]!=0){
if(dist[i]>dist[t]/g[t][i]){
dist[i]=dist[t]/g[t][i];//松弛,更新
q.push(i);
}
}
}
}
}
int main(){
cin>>n>>m;
int a,b,c;
for(int i=0;i<=n;i++)
dist[i]=100000;//赋值为INF
for(int i=0;i<m;i++){
scanf("%d %d %d",&a,&b,&c);
g[a][b]=g[b][a]=max(g[a][b],(100.0-c)/100);
}
cin>>rs>>re;
bfs();
printf("%.8lf",dist[rs]);
}