dj变形 求最长路
题目链接
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long int ll;
const int maxn = 10000005;
const int N=2020;
int n,m,head[N],tot,vis[N];
double dis[N];
struct node
{
int to,nxt;
double w;
}t[200001];
void add(int u,int v,double w)
{
t[++tot].to=v;
t[tot].w=w;
t[tot].nxt=head[u];
head[u]=tot;
}
void dij(int s)
{
for(int i=1; i<=n; i++)
{
dis[i]=maxn*1.0;
}
dis[s]=100;
for(int i=1; i<=n; i++)
{
int minn=maxn,tt=-1;
for(int j=1; j<=n; j++)
{
if(dis[j]<minn&&!vis[j])
{
minn=dis[j];
tt=j;
}
}
vis[tt]=1;
if(tt==-1)
break;
for(int j=head[tt]; j!=-1; j=t[j].nxt)
{
if(dis[t[j].to] > dis[tt]/t[j].w)
{
dis[t[j].to] = dis[tt]/t[j].w;
}//min
}
}
}
int main()
{
int m;
cin>>n>>m;
for(int i=1;i<=n;++i)
head[i]=-1;
for(int i=1; i<=m; i++)
{
int a,b,c;
cin>>a>>b>>c;
double w=(100-c)/100.0;
add(a,b,w);
add(b,a,w);
}
int A,B;
cin>>A>>B;
dij(A);
printf("%.8lf",dis[B]);
return 0;
}