zoukankan      html  css  js  c++  java
  • 杭电 2544 最短路径

    Problem Description

    在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?

    Input

    输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
    输入保证至少存在1条商店到赛场的路线。
     

    Output

    对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
     

    Sample Input

    2 1
    1 2 3
    3 3
    1 2 5
    2 3 5
    3 1 2
    0 0
     

    Sample Output

    3
    2
     
    1. 定义数组map[i][j]元素为无穷大,当i == j时为0;
    2. 输入数据记录最小的map[i][j],map[i][j]为i到j的的距离
    3. 计算出每两个节点间的最小距离(或者始节点到每个节点的最小距离)(算法不同)
    4. 输出始节点到终节点距离
     
     1 #include<cstdio>
     2 #include<string.h>
     3 #include<algorithm>
     4 #define INF 0xfffffff
     5 using namespace std;
     6 int m,n,i,j,a,b,c,map[1010][1010],len[1010],flag[1010];
     7 void f1()
     8 {
     9     int i,j;
    10     memset(flag,0,sizeof(flag));    //标记已确定最短路径的点 
    11     flag[1]=1;
    12     for(i = 2 ; i <= n ;i++)
    13     {
    14         len[i]=map[1][i];            //len[i]表示节点1到节点i的距离 
    15     }
    16     for(i = 0 ; i < n ;i++)            //循环n次算出节点1到所有节点的最短距离 
    17     {
    18         int M=INF,k=-1;
    19         for(j = 1 ; j <= n ; j++)    //找出与节点1最近的节点 
    20         {
    21             if(!flag[j] && len[j] < M)
    22             {
    23                 M=len[j];
    24                 k=j;
    25             }
    26         }
    27             if(k == -1)
    28             {
    29                 return;
    30             }
    31             flag[k]=1;
    32             for(j = 1 ; j <= n ;j++)    //比较从节点1到各点的距离和从节点1到节点k再到各节点的距离 
    33             {
    34                 if(!flag[j] && len[j] > len[k]+map[k][j])
    35                 {
    36                     len[j]=len[k]+map[k][j];
    37                 }
    38             }
    39         
    40     }
    41 }
    42 void f2()            //求两两点之间的距离 
    43 {
    44     int k,i,j;
    45     for(k = 1 ; k <= n ; k++)        //中间点 
    46     {
    47         for(i = 1 ; i <= n ; i++)
    48         {
    49             for(j = 1 ; j <= n ; j++)
    50             {
    51                 map[i][j]=min(map[i][j],map[i][k]+map[k][j]);    //比较i到j的距离与i到k再到j的距离 
    52             }
    53         }
    54     }
    55 }
    56 int main()
    57 {
    58     while(scanf("%d %d",&n,&m) && (n+m))
    59     {
    60         for(i = 1 ; i <= n ; i++)
    61         {
    62             for(j = 1 ; j <= n ; j++)
    63             {
    64                 map[i][j]=(i == j)?0:INF;
    65             }
    66         }
    67         for(i = 1 ; i <= m ;i++)
    68         {
    69             scanf("%d %d %d",&a,&b,&c);
    70             if(map[a][b] > c)
    71             {
    72                 map[a][b]=map[b][a]=c;
    73             }
    74         }
    75     //    f1();
    76     //    printf("%d
    ",len[n]);
    77         f2();
    78         printf("%d
    ",map[1][n]);
    79     }
    80 }
    ——将来的你会感谢现在努力的自己。
  • 相关阅读:
    Visual Studio.Net 已检测到指定的Web服务器运行的不是ASP.NET1.1版。您将无法运行ASP.NET Web应用程序或服务。
    ActiveX 部件不能创建对象
    XML Schema帮你建模
    XBRL CHINA - XBRL入门
    Xml文档验证—编程篇
    怎样用XML技术对数据库进行操作
    Vclskin 问答
    Altova XMLSpy Ent 2006 汉化特别版 破解版
    一个通过DataSet操作XML的类
    XML Schema教程
  • 原文地址:https://www.cnblogs.com/yexiaozi/p/5736723.html
Copyright © 2011-2022 走看看