Loading

Dijkstra变形 求最长路

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;
}
posted @ 2020-09-14 17:01  EdisonBa  阅读(488)  评论(0编辑  收藏  举报