HDU 2145 (A strange lift) 最短路(Dijkstra)

微笑没什么可以注意的就是终点当成起点,注意floyd会超时,因为我一开始就是用floyd写的但我不知道为毛300*300*300会超时。

还有一点要注意的就是结构题快排的cmp函数的内部结构。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define inf 0x7ffffff
using namespace std;
const int N=300+5;
int map[N][N],p[N],spd[N];
int n,m,k;
int vis[N],dis[N];
struct node
{
	double tim;
	int len;
	int id;
}V[N];
bool cmp(node a,node b)
{
	if(a.tim==b.tim)
	{
		if(a.len==b.len)
		{
			return a.id>b.id;
		}
		else return a.len>b.len;
	}
	else return a.tim<b.tim;
}
void dijkstra(int ed)
{
	memset(vis,0,sizeof(vis));
	for(int i=1;i<=n;i++)
	{
		dis[i]=map[ed][i];
	}
	vis[ed]=1;
	dis[ed]=0;
	for(int i=2;i<=n;i++)
	{
		int temp;
		int Min=inf;
		for(int j=1;j<=n;j++)
		{
			if(!vis[j]&&Min>dis[j])
			{
				temp=j;
				Min=dis[j];
			}
		}
		if(Min==inf) break;
		vis[temp]=1;
		for(int j=1;j<=n;j++)
		{
			if(!vis[j]&&map[temp][j]<inf)
			{
				if(dis[j]>dis[temp]+map[temp][j])
				{
					dis[j]=dis[temp]+map[temp][j];
				}
			}
		}
	}
}
int main()
{
	while(~scanf("%d%d%d",&n,&m,&k))
	{
		int ed;
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				if(i==j) map[i][j]=0;
				else map[i][j]=inf;
			}
		}
		for(int i=1;i<=k;i++)
		{
			int u,v,w;
			scanf("%d%d%d",&u,&v,&w);
			if(w<map[v][u])
			{
				map[v][u]=w;
			}
		}
		scanf("%d",&ed);
		dijkstra(ed);
		for(int i=1;i<=m;i++)
		{
			scanf("%d",&p[i]);
		}
		for(int i=1;i<=m;i++)
		{
			scanf("%d",&spd[i]);
		}
		for(int i=1;i<=m;i++)
		{
			if(dis[p[i]]>=inf)
			{
				V[i].tim=inf;
				V[i].len=inf;
				V[i].id=i;
			}
			else
			{
				V[i].tim=dis[p[i]]*1.0/spd[i];
				V[i].len=dis[p[i]];
				V[i].id=i;
			}
		}
		sort(V+1,V+1+m,cmp);
		if(V[1].tim==inf) printf("No one\n");
		else printf("%d\n",V[1].id);
	}
	return 0;
}


你可能感兴趣的:(最短路,dijkstra)