• 畅通工程续 HDOJ--1874


    畅通工程续

    Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
    Total Submission(s) : 15   Accepted Submission(s) : 4
    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
    思路:Dijkstra算法入门题,可是。。。这题有陷阱,有重边!我wa了好多次。
    AC代码:
     1 #include<stdio.h>
     2 #include<string.h>
     3 int map[205][205],dist[205];
     4 int vis[205],n,m,s,t,s;
     5 void init1()
     6 {
     7     int i,j;
     8     memset(vis,0,sizeof(vis));
     9     for(i = 0;i < n;i ++)
    10     {
    11         for(j = 0;j < n;j ++)
    12         {
    13             if(i != j)
    14                 map[i][j] = 1 << 30;
    15             else
    16                 map[i][j] = 0;
    17         }
    18     }
    19     return ;
    20 }
    21 
    22 void init2()
    23 {
    24     int i;
    25     for(i = 0;i < n;i ++)
    26         dist[i] = map[s][i];
    27     return ;
    28 }
    29 
    30 void Dijkstra()
    31 {
    32     int i,j,k,min;
    33     vis[s] = 1;
    34     for(i = 0;i < n;i ++)
    35     {
    36         min = 1 << 30;
    37         k = -1;
    38         for(j = 0;j < n;j ++)
    39         {
    40             if(!vis[j] && dist[j] < min)
    41             {
    42                 min = dist[j];
    43                 k = j;
    44             }
    45         }
    46         if(k == -1)
    47             return ;
    48         vis[k] = 1;
    49         for(j = 0;j < n;j ++)
    50         {
    51             if(!vis[j] && dist[j] > map[k][j]+dist[k])
    52                 dist[j] = map[k][j]+dist[k];
    53         }
    54     }
    55     return ;
    56 }
    57 
    58 int main(void)
    59 {
    60     int i,j;
    61     int a,b,x;
    62     while(~scanf("%d%d",&n,&m))
    63     {
    64         init1();
    65         while(m--)
    66         {
    67             scanf("%d%d%d",&a,&b,&x);
    68             if(map[a][b] > x)
    69                 map[a][b] = map[b][a] = x;
    70         }
    71         scanf("%d%d",&s,&t);
    72         init2();
    73         Dijkstra();
    74         if(dist[t] != 1 << 30)
    75             printf("%d
    ",dist[t]);
    76         else
    77             printf("-1
    ");
    78     }
    79     return 0;
    80 }
  • 相关阅读:
    【剑指offer】3-数组中重复的数字
    自定义管道遇到问题解决方案
    vue的双向绑定示例
    子组件传递给父组件数据
    vue里的共享对象示例
    mysql里的explain介绍
    mysql索引
    修改MySQL字符集
    v-model修饰符示例
    vue下拉列表示例
  • 原文地址:https://www.cnblogs.com/anhuizhiye/p/3399484.html
Copyright © 2020-2023  润新知