zoukankan      html  css  js  c++  java
  • 杭电 1874 畅通工程续 (求某节点到某节点的最短路径)

    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

    最短路径模板
    1. 定义数组map[i][j]元素为无穷大,当i == j时为0;
    2. 输入数据记录最小的map[i][j],map[i][j]为i到j的的距离
    3. 计算出每两个节点间的最小距离(或者始节点到每个节点的最小距离)(算法不同)
    4. 输出始节点到终节点距离
     
     1 #include<cstdio>
     2 #define INF 0xfffffff
     3 #include<string.h>
     4 using namespace std;
     5 int m,n,a,b,c,flag[20000],map[20000][20000],len[20000],begin,end;
     6 void f1()
     7 {
     8     int i,j;
     9     memset(flag,0,sizeof(flag));            //标记已确定从begin出最短路径的节点 
    10     for(i = 0 ; i < n ; i++)
    11     {
    12         len[i]=map[begin][i];                //len[i]表示节点begin到节点i的距离 
    13     }
    14     flag[begin]=1;
    15     for(i = 0 ; i < n ;i++)                    //循环n次算出节点begin到所有节点的最短距离
    16     {
    17         int min=INF,k=-1;
    18         for(j = 0 ; j < n ; j++)            //找出与节点begin最近的节点 
    19         {
    20             if(!flag[j] && min > len[j])
    21             {
    22                 min=len[j];
    23                 k=j;
    24             }
    25         }
    26         if(k == -1)
    27         {
    28             return;
    29         }
    30         flag[k]=1;
    31         for(j = 0 ; j < n ; j++)            //比较从节点begin到各点的距离和从节点begin到节点k再到各节点的距离
    32         {
    33             if(!flag[j] && len[j] > len[k]+map[k][j])
    34             {
    35                 len[j]=len[k]+map[k][j];
    36             }
    37         }
    38     }
    39 }
    40 int main()
    41 {
    42     int i,j;
    43     while(scanf("%d %d",&n,&m)!=EOF)
    44     {
    45         for(i = 0 ; i < n ; i++)
    46         {
    47             for(j = 0 ; j < n ; j++)
    48             {
    49                 map[i][j]=(i == j)?0:INF;
    50             }
    51         }
    52         for(i = 0 ; i < m ; i++)
    53         {
    54             scanf("%d %d %d",&a,&b,&c);
    55             if(map[a][b] > c)
    56             {
    57                 map[a][b]=map[b][a]=c;
    58             }
    59         }
    60         scanf("%d %d",&begin,&end);
    61         f1();
    62         if(len[end] < INF)                        //若存在路径则路径小于“无穷大” 
    63         printf("%d
    ",len[end]);
    64         else
    65         printf("-1
    ");
    66     }
    67     
    68  } 
    ——将来的你会感谢现在努力的自己。
  • 相关阅读:
    mass Framework event模块 v9
    关于开源的网络爬虫/网络蜘蛛larbin结构分析
    socketaddr和socketaddr_in的区别于联系
    C语言中.h和.c文件解析
    [原]变参函数原理详解
    fopen和open有什么区别?
    C语言的那些小秘密之变参函数的实现
    c语言中逗号运算符和逗号表达式
    关于REST API设计的一些小经验
    Linux信号说明列表
  • 原文地址:https://www.cnblogs.com/yexiaozi/p/5737082.html
Copyright © 2011-2022 走看看