zoukankan      html  css  js  c++  java
  • 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
    ", 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 }
  • 相关阅读:
    【技术评网】说说豆瓣的URL设计
    在这一刻,还是忍不住满眼泪水
    装Sybase,装WAS 6.1的时候报错java.exe损坏的图象
    JasperRepor导出报表通用类
    XSS跨站攻击
    sql 脚本
    解决在无线网络下本机无法连接linux(红帽)虚拟机问题
    pl /sql导入导出表结构,表数据,sql脚本
    asp.net关于WEB端用户重复提交问题。禁用服务器控件按钮问题。
    MQ命令学习总结大全MQ常用命令
  • 原文地址:https://www.cnblogs.com/JZQT/p/3802446.html
Copyright © 2011-2022 走看看