标签:
6 2 3 1 3 5 1 4 7 2 8 12 3 8 4 4 9 12 9 10 2 1 2 8 9 10
9
解析:只需要将以草儿家为源点,相邻城市的最短路径初始为0,然后使用Dijkstra算法处理,求出草儿家到所有城市的最短距离,然后再找出草儿想去的城市中最短路径的最小值即可。不过要注意是无向图!!!
AC代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define INF 1234567
#define MAXN 1000 + 2
int V, E;
int w[MAXN][MAXN];
int vis[MAXN], dis[MAXN];
void dijkstra(){
memset(vis, 0, sizeof(vis)); //预处理
for(int i=0; i<=V; i++) dis[i] = (i == 0 ? 0 : INF);
for(int i=0; i<=V; i++){ //dijkstra
int x, m = INF;
for(int y=0; y<=V; y++) //找未标记的d[y]的最小值
if(!vis[y] && dis[y] <= m){
x = y;
m = dis[x];
}
vis[x] = 1;
for(int y=0; y<=V ;y++) dis[y] = min(dis[y], dis[x] + w[x][y]);
}
}
int main(){
#ifdef sxk
freopen("in.txt", "r", stdin);
#endif // sxk
int t, s, e, time, S;
while(scanf("%d%d%d", &E, &S, &t)!=EOF){
for(int i=0; i<MAXN; i++)
for(int j=0; j<MAXN; j++) w[i][j] = (i==j) ? 0 : INF;
V = 0;
for(int i=0; i<E; i++){
scanf("%d%d%d", &s, &e, &time);
V = max(max(V, s), e);
w[s][e] = w[e][s] = min(w[s][e], time);
}
for(int i=0; i<S; i++){
scanf("%d", &s);
w[0][s] = w[s][0] = 0;
}
dijkstra(); //处理
int ans = INF; //找其中的最大跳跃高度
int foo;
for(int i=0; i<t; i++){
scanf("%d", &foo);
ans = min(ans, dis[foo]);
}
printf("%d\n", ans);
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/u013446688/article/details/42835759