zoukankan      html  css  js  c++  java
  • HDOJ1874 畅通工程续[最短路径问题Dijkstra算法]

    转自:http://www.wutianqi.com/?p=1894

    畅通工程续

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 13049    Accepted Submission(s): 4436


    Problem Description
    某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。

    现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
     
    Input
    本题目包含多组数据,请处理到文件结束。
    每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。
    接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。
    再接下一行有两个整数S,T(0<=S,T<N),分别代表起点和终点。
     
    Output
    对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1.
     
    Sample Input
    3 3 0 1 1 0 2 3 1 2 1 0 2 3 1 0 1 1 1 2
     
    Sample Output
    2 -1
     
    Author
    linle
     
    Source
     
    Recommend
    lcy

    code:

     1 #include <iostream>   
     2 #include <iomanip>   
     3 #include <fstream>   
     4 #include <sstream>   
     5 #include <algorithm>   
     6 #include <string>   
     7 #include <set>   
     8 #include <utility>   
     9 #include <queue>   
    10 #include <stack>   
    11 #include <list>   
    12 #include <vector>   
    13 #include <cstdio>   
    14 #include <cstdlib>   
    15 #include <cstring>   
    16 #include <cmath>   
    17 #include <ctime>   
    18 #include <ctype.h> 
    19 using namespace std;
    20 
    21 #define MAXN 201
    22 
    23 int dis[MAXN];
    24 int pre[MAXN];
    25 int map[MAXN][MAXN];
    26 bool vst[MAXN];
    27 int n,m;
    28 int s,t;
    29 
    30 void Dijkstra()
    31 {
    32     int i,j;
    33     for(i=1;i<=n;++i)
    34     {
    35         dis[i]=map[s][i];
    36         vst[i]=0;
    37     }
    38     dis[s]=0;
    39     vst[s]=1;
    40     for(i=2;i<=n;++i)
    41     {
    42         int mindis=INT_MAX;
    43         int nextgoal=s;
    44         for(j=1;j<=n;++j)
    45             if((!vst[j])&&dis[j]<mindis)
    46             {
    47                 nextgoal=j;
    48                 mindis=dis[j];
    49             }
    50         vst[nextgoal]=1;
    51         for(j=1;j<=n;++j)
    52             if((!vst[j])&&(map[nextgoal][j]<INT_MAX))
    53             {
    54                 int updatedis=dis[nextgoal]+map[nextgoal][j];
    55                 if(dis[j]>updatedis)
    56                     dis[j]=updatedis;
    57             }
    58     }
    59 }
    60 int main()
    61 {
    62     int i,j;
    63     int a,b,distance;
    64     while(~scanf("%d%d",&n,&m))
    65     {
    66         for(i=1;i<=n;++i)
    67             for(j=1;j<=n;++j)
    68             {
    69                 if(i==j)
    70                     map[i][j]=0;
    71                 else
    72                     map[i][j]=INT_MAX;
    73             }
    74         for(i=1;i<=m;++i)
    75         {
    76             scanf("%d%d%d",&a,&b,&distance);
    77             if(map[a+1][b+1]>distance)
    78             {
    79                 map[a+1][b+1]=distance;
    80                 map[b+1][a+1]=distance;
    81             }
    82         }
    83         scanf("%d%d",&s,&t);
    84         s++;
    85         for(i=1;i<=n;++i)
    86             dis[i]=INT_MAX;
    87         Dijkstra();
    88         if(dis[t+1]!=INT_MAX)
    89             printf("%d\n",dis[t+1]);
    90         else
    91             printf("-1\n");
    92     }    
    93     return 0;
    94 }
  • 相关阅读:
    数组排序 -- 冒泡排序
    数组自带的函数(方法)
    京东官网轮播图的实现
    鼠标单击元素输出对应元素的索引号
    JavaScript中获取HTML元素的方式
    JavaScript数组的2种定义方式
    this关键字
    JavaScript中对象的3种定义方式
    Hadoop完整搭建过程(三):完全分布模式(虚拟机)
    Hadoop完整搭建过程(二):伪分布模式
  • 原文地址:https://www.cnblogs.com/XBWer/p/2620412.html
Copyright © 2011-2022 走看看