hdoj 2066一个人的旅行

这题最重要的就是设置一个超级原点,即他的城镇,然后连接超级原点到相邻的城市的距离为0 ,接下来就是套用模板了,哦,对了,要优化一下,不然貌似数据蛮大的,
View Code
1 #include"stdio.h"
2 #include"math.h"
3 #include"string.h"
4 #define maxn 0x7ffffff
5
6 int map[1001][1001],s,t,n,m;
7 int alls;
8 int dist[1001];
9
10 void dij()
11 {
12 int visit[1001],i,j,k,minn;
13 for(i=0;i<=n;i++)
14 {
15 visit[i] = 0;
16 dist[i] = map[s][i];
17 }
18
19 visit[s] = 1;
20 for(i=1;i<=n;i++)
21 {
22 j = s;
23 minn = maxn;
24 for(k=0;k<=n;k++)
25 {
26 if(!visit[k] && dist[k]<minn)
27 {
28 minn = dist[k];
29 j = k;
30 }
31 }
32 visit[j] = 1;
33 for(k=0;k<=n;k++)
34 {
35 if(!visit[k] && dist[k]>map[j][k]+dist[j] && map[j][k]<maxn)
36 {
37 dist[k] = map[j][k] + dist[j];
38 }
39 }
40 }
41 }
42
43 int main()
44 {
45 int i,j,k,city,a,b,c,link[1001],home,gold;
46
47 while(scanf("%d%d%d",&m,&home,&gold)!=EOF)
48 {
49 for(i=0;i<=1000;i++)
50 {
51 for(j=0;j<=1000;j++)
52 {
53 map[i][j] = maxn;
54 }
55 }
56 n = 1000;
57 for(i=1;i<=m;i++)
58 {
59 scanf("%d%d%d",&a,&b,&c);
60 if(map[a][b]>c)
61 {
62 map[a][b] = c;
63 map[b][a] = c;
64 if(n<a)n = a;
65 if(n<b)n = b;
66 }
67
68
69 }
70 s = 0,t = n;
71 for(i=1;i<=home;i++)//设置0为超级原点
72 {
73 scanf("%d",&c);
74 map[0][c] = 0;
75 }
76 dij();
77 c = maxn;
78 for(i=1;i<=gold;i++)
79 {
80 scanf("%d",&a);
81 c = c>dist[a]?dist[a]:c;
82 }
83 printf("%d\n",c);
84 }
85 return 0;
86 }

posted @ 2011-05-03 21:55  xiaoln  阅读(268)  评论(0编辑  收藏  举报