您的位置:首页 > 其它

hdu 2066 一个人的旅行(最短路+SPFA)

2016-03-24 22:29 295 查看

一个人的旅行

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=2066

解题思路:

很裸的一道最短路问题,可以将草儿的家看做0,从草儿家到相邻镇的花费看做0,那么我们就只需要求草儿家到各个目的地的最短

路即可,一次SPFA便可解决。

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#define INF 0xfffffff
using namespace std;

struct Edge{
int to,cost;
};
vector<Edge> edge[5005];
int vis[1005];
int dis[1005];//最短距离

void SPFA(int st){
queue<int> q;
int i;
memset(vis,0,sizeof(vis));
for(i = 0; i <= 1000; i++)
dis[i] = INF;
dis[st] = 0;
vis[st] = 1;
q.push(st);
while(!q.empty()){
int cur = q.front();
q.pop();
vis[cur] = 0;
int l = edge[cur].size();
for(i = 0; i < l; i++){
int tmp = edge[cur][i].to;
if(dis[tmp] > dis[cur] + edge[cur][i].cost){
dis[tmp] = dis[cur] + edge[cur][i].cost;
if(!vis[tmp]){
q.push(tmp);
vis[tmp] = 1;
}
}
}
}
}

int main(){
int t,s,d;
while(~scanf("%d%d%d",&t,&s,&d)){
for(int i = 0; i <= 1000; i++)
edge[i].clear();
int u,v,cost;
Edge tmp;
for(int i = 0; i < t; i++){
scanf("%d%d%d",&u,&v,&cost);
tmp.to = v;tmp.cost = cost;
edge[u].push_back(tmp);
tmp.to = u;
edge[v].push_back(tmp);
}
for(int i = 0; i < s; i++){
scanf("%d",&u);
tmp.to = u;tmp.cost = 0;
edge[0].push_back(tmp);
}
int mintime = INF;
SPFA(0);
for(int i = 0; i < d; i++){
scanf("%d",&u);
mintime = min(mintime,dis[u]);
}
printf("%d\n",mintime);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: