这题就是裸的dij
直接从终点求最短路
(我就把y总的反了一下 ovo水一发)
将dis[]初始化INF(1e9 )然后
首先初始化终点需要的钱dis[t]=100;
从终点往前走dis[v]=dis[t]/(0.01w+1);
然后在Edge[]中w直接为(0.01w+1)
每次转移等于dis[u]/w
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int N=2e3+10,M=2e5+10;
struct Edge{
int v,next;
double w;
}edge[M];
typedef pair<double,int> PDI;
int head[N],tot,n,m,s,t;
double dis[N];
bool vis[N];
void add(int u,int v,int w){
edge[++tot].v=v;
edge[tot].w=1-w*0.01;
edge[tot].next=head[u];
head[u]=tot;
}
void dij(){
priority_queue<PDI,vector<PDI>,greater<PDI>>q;
for(register int i=1;i<=n;i++){//dis初始化为最大值
dis[i]=1e9;
}
q.push({100,t});
dis[t]=100;
while(!q.empty()){
int u=q.top().second;
q.pop();
if(vis[u])continue;
vis[u]=true;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].v;
double w=edge[i].w;
if(dis[v]>dis[u]/w){//与普通模板仅转移方式不同
dis[v]=dis[u]/w;
q.push({dis[v],v});
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w;
add(u,v,w);
add(v,u,w);
}
cin>>s>>t;
dij();
printf("%.8f",dis[s]);
}
看了一圈就你和我思路一样(话说好多题解怎么都是一样的…