HDU 2066(dijkstra算法模板题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2066

标准最短路径问题,起点可以看作是草儿家,从草儿家到与家相连的地方time=0,dijkstra求最短路径,然后找出想去地方的最小代价就行了,经典模板题,但是WA了好几次,开始找不出错误,后来发现体重有句话:(1=<(a,b)<=1000;a,b 之间可能有多条路),瞬时明白了,两点之间可以有多条路径的。 

 

当然我的代码中,dijkstra 中的 n有些大了,我们可以在主函数中记录下u,v的最大值作为n就够了,不必每次都遍历完

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #define INF 100000000
 5 #define n 1000
 6 
 7 using namespace std;
 8 int map[1100][1100],dis[1100],flag[1100];
 9 int T,S,D;
10 void dijkstra()
11 {
12     int i,j,k,min;
13     memset(flag,0,sizeof(flag));
14     flag[0]=1;
15     for(i=0;i<=n;i++)
16     {
17         dis[i]=map[0][i];
18     }
19     for(i=1;i<n;i++)
20     {
21         min=INF;
22         for(j=1;j<=n;j++)
23         {
24             if(!flag[j]&&dis[j]<min)
25             {
26                 min=dis[j];
27                 k=j;
28             }
29         }
30         flag[k]=1;
31         for(j=1;j<=n;j++)
32         {
33             if(!flag[j]&&dis[j]>dis[k]+map[k][j])
34                 dis[j]=dis[k]+map[k][j];
35         }
36     }
37 }
38 int main()
39 {
40     int u,v,w,x,y,min;
41     while(scanf("%d%d%d",&T,&S,&D)!=EOF)
42     {
43         for(int i=0;i<1010;i++)
44             for(int j=0;j<1010;j++)
45                 map[i][j]=INF;
46         for(int i=1;i<=T;i++)
47         {
48             scanf("%d%d%d",&u,&v,&w);
49             map[u][v]=map[u][v]>w?w:map[u][v];   //可能两点之间有多条路径
50             map[v][u]=map[u][v];
51         }
52         for(int i=1;i<=S;i++)
53         {
54             scanf("%d",&x);
55             map[0][x]=0;
56             map[x][0]=0;
57         }
58         dijkstra();
59         min=INF;
60         for(int i=0;i<D;i++)
61         {
62             scanf("%d",&y);
63             if(min>dis[y]) min=dis[y];
64         }
65         printf("%d\n",min);
66     }
67     return 0;
68 }
View Code

 

posted @ 2013-09-11 10:34  hjf007  阅读(794)  评论(0编辑  收藏  举报