hdoj 2066一个人的旅行

这题最重要的就是设置一个超级原点,即他的城镇,然后连接超级原点到相邻的城市的距离为0 ,接下来就是套用模板了,哦,对了,要优化一下,不然貌似数据蛮大的,
ContractedBlock.gif ExpandedBlockStart.gif 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 }

转载于:https://www.cnblogs.com/yuecxl/archive/2011/05/03/2035907.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值