hdu2680 Choose the best route

多点到一点的最短距离,因为点的编号是从1到n所以把0作为新的起点

将所有可能的起点跟0连接,转换为求单源最短路径用dijkstra即可。

1 #include <stdio.h>
2 #include <string.h>
3
4  #define INF 999999999
5  #define MAX 1007
6
7 int n,map[MAX][MAX];
8 int dijkstra(int str, int end){
9 bool hash[MAX];
10 int i,min,path[MAX];
11
12 for(i = 0; i <= n; i++){
13 hash[i] = true;
14 path[i] = INF;
15 }
16 hash[str] = false;
17 path[str] = 0;
18 while(str != end){
19 for(i = 0; i <= n; i++){
20 if(map[str][i])
21 if(path[i] > path[str] + map[str][i])
22 path[i] = path[str] + map[str][i];
23 }
24
25 min = INF;
26 for(i = 0; i <= n; i++){
27 if(path[i] < min && hash[i]){
28 min = path[i];
29 str = i;
30 }
31 }
32 if(min == INF)
33 break;
34 hash[str] = false;
35 }
36 return path[end];
37 }
38
39 int main (void){
40 int i,m,s,p,q,t,w,ans;
41 while(scanf("%d%d%d",&n,&m,&s)!=EOF){
42 memset(map,0,sizeof(map));
43 for(i = 0; i < m; i++){
44 scanf("%d%d%d",&p,&q,&t);
45 if(!map[p][q])
46 map[p][q] = t;
47 else if(map[p][q] > t)
48 map[p][q] = t;
49 }
50 scanf("%d",&w);
51 for(i = 0; i < w; i++){
52 scanf("%d",&q);
53 map[0][q] = 1;
54 }
55 ans = dijkstra(0,s);
56 if(ans != INF)
57 printf("%d\n",ans - 1);
58 else
59 printf("-1\n");
60 }
61 return 0;
62 }

posted on 2011-04-20 12:52  死线之蓝  阅读(212)  评论(0编辑  收藏  举报

导航