您的位置:首页 > 其它

HDU 2066 一个人的旅行(Dijkstrea)

2017-05-20 08:44 381 查看
http://acm.hdu.edu.cn/showproblem.php?pid=2066

分析:

典型的最短路问题   不过要注意几点  

1、草儿的家所在的城镇没有火车   她要去与她家相邻的城镇坐车  起始位置是车站 有多个起点   但是我们可以将草儿的家记作0  到车站的距离为0   这样就有一个起点了   

2、题目没有告诉有多少个城市   所以要记录一下最大的城市编号

AC代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

#define inf 0x3f3f3f3f
int map[1005][1005];
int vis[1005];
int dis[1005];
int n;

void Dijkstra(){

int v;
for (int i=0;i<=n;i++){
dis[i]=map[0][i];
vis[i]=0;
}
dis[0]=0;
vis[0]=1;

for (int i=1;i<=n;i++){
int minn=inf;
for (int j=1;j<=n;j++){
if(!vis[j]&&dis[j]<minn){
minn=dis[j];
v=j;
}
}
vis[v]=1;
for (int j=1;j<=n;j++){
if(!vis[j]&&dis[j]>dis[v]+map[v][j]){
dis[j]=dis[v]+map[v][j];
}
}
}

}

int main (){
int T,S,D;
while (scanf ("%d%d%d",&T,&S,&D)!=EOF){

for (int i=0;i<=1000;i++){
for (int j=0;j<=1000;j++){
if(i!=j)
map[i][j]=inf;
else
map[i][j]=0;
}
}

n=-1;
for (int i=0;i<T;i++){
int a,b,t;
scanf ("%d%d%d",&a,&b,&t);
n=max(max(a,b),n);// 找的最大的城市编号
if(map[a][b]>t){
map[a][b]=t;
map[b][a]=t;
}
}
for (int i=0;i<S;i++){ // 草儿的家为0
int x;
scanf ("%d",&x);
map[0][x]=0;
map[x][0]=0;
}

Dijkstra();

int l;
int minn=inf;
for (int i=0;i<D;i++){
scanf ("%d",&l);// 草儿想去的地方
if(dis[l]<minn){
minn=dis[l];

}
}
printf ("%d\n",minn);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息