POJ-2387-Til the Cows Come Home 解题报告

       这是一个简单的最短路问题。题意:给定有N个地点(编号从1到N),T条道路,先输入两个正整数T和N,然后接下来T行,每行三个整数,分别代表这条道路的起点终点和长度。要求求出从N到1的最短路、、、


       解法:不能用Floyd,因为节点达到了1000,Floyd的时间复杂度为O(n的三次方),会TLE。用普通的Dijkstra就行了。


       注意:题目数据有些坑、、、题目意思是说道路最大长度不超过100,但是实际上可能达到了几十万,因此建议将最大值调大一些。而且,输入会有重边,这点很容易忽略。另外,此题是多case的。


       接下来是解题代码:Dijkstra解法

 1 #include <stdio.h>
 2 #define N 2001
 3 #define MAX 99999999
 4 
 5 int map[N][N];  //建立图,map[i][j]代表i到j的距离
 6 int dis[N];     //dis[i]代表起点到i的距离
 7 int flag[N];    //标记变量
 8 int t, n;
 9 
10 void Init();    //初始化
11 
12 void Read();    //输入
13 
14 void Dijkstra();
15 
16 int main()
17 {
18     while (~scanf("%d %d", &t, &n))
19     {
20         Init();
21         Read();
22         Dijkstra();
23         printf("%d\n", dis[1]);
24     }
25     return 0;
26 }
27 
28 void Init()     //初始化
29 {
30     int i, j;
31     for (i=0; i<N; i++)
32     {
33         for (j=0; j<N; j++)
34         {
35             map[i][j] = MAX;
36         }
37         flag[i] = 0;
38         dis[i] = MAX;
39     }
40     return;
41 }
42 
43 void Read()     //输入
44 {
45     int i;
46     int a, b, len;
47     for (i=0; i<t; ++i)
48     {
49         scanf("%d %d %d", &a, &b, &len);
50         if (map[a][b] > len)        //解决重边问题
51         {
52             map[a][b] = map[b][a] = len;
53         }
54     }
55     return;
56 }
57 
58 void Dijkstra()
59 {
60     int i, j, k;
61     int min;
62     dis[n] = 0;
63     for (i=1; i<=n; ++i)
64     {
65         min = MAX;
66         for (j=1; j<=n; ++j)
67         {
68             if (flag[j] == 0 && dis[j] < min)
69             {
70                 min = dis[k = j];
71             }
72         }
73         flag[k] = 1;
74         for (j=1; j<=n; ++j)
75         {
76             if (dis[j] > dis[k] + map[k][j])
77             {
78                 dis[j] = dis[k] + map[k][j];
79             }
80         }
81     }
82     return;
83 }

转载于:https://www.cnblogs.com/JZQT/p/3802446.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值