您的位置:首页 > 其它

HDU 2066 一个人的旅行

2017-10-11 20:43 253 查看
题目链接

题目意思

给你T条路,现在小草要从S个与他相邻的城市出发,去D个目的地中的一个,要你求到达目的地的最短时间。

解题思路

这就一道用dijkstra的最短路的题。这道题中的坑点就是小草到他相邻的城市的距离是0。用dijkstra跑一遍就出答案啦!

代码部分

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <queue>
using namespace std;
const int INF=99999;
int map[1010][1010];
int dis[1010];///存储最短路
int vis[1010];///标记数组
int nex[1010];///记录与他相邻的城市
int ed[1010];///记录目的地
int t,s,d,n;
int dijkstra()
{
int pos;
memset(vis,0,sizeof(vis));
for(int i=0; i<=n; i++)
dis[i]=map[0][i];
vis[0]=1;
for(int i=1; i<=n; i++)
{
int min=INF;
for(int j=1; j<=n; j++)
{
if(!vis[j]&&min>dis[j])
{
min=dis[j];
pos=j;
}
}
vis[pos]=1;
for(int j=1; j<=n; j++)
{
if(!vis[j]&&dis[j]>map[pos][j]+dis[pos])
dis[j]=map[pos][j]+dis[pos];
}
}
}
int main()
{
int a,b,tim,ans;
while(scanf("%d%d%d",&t,&s,&d)!=EOF)
{
n=0;
for(int i=0; i<1010; i++)
for(int j=0; j<1010; j++)
{
map[i][j]=INF;
map[i][i]=0;
}
while(t--)
{
scanf("%d%d%d",&a,&b,&tim);
n=max(max(n,a),b);
if(map[a][b]>tim)
map[a][b]=map[b][a]=tim;
}
ans=INF;
for(int i=0; i<s; i++)
{
scanf("%d",&nex[i]);
map[0][nex[i]]=map[nex[i]][0]=0;
}
for(int i=0; i<d; i++)
{
scanf("%d",&ed[i]);
}
dijkstra();
for(int i=0; i<d; i++)
{
ans=min(ans,dis[ed[i]]);
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: