HDU 2544 最短路

在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的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
 //这类题目记得处理重边
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std ;
int
main ()
{

    int
n ,m ,i ,j ,min ,c ;
    int
map [ 103 ][ 103 ],b [ 103 ];
    while
(scanf ( "%d%d" ,&n ,&m ),n ||m )
    {

         memset (b , 0 , sizeof (b ));
         for
(i = 1 ;i <=n ;i ++)
           for
(j = 1 ;j <=n ;j ++)
             map [i ][j ]= 0xffffff ;
        for
(min = 0 ;min <m ;min ++)
        {

            scanf ( "%d%d%d" ,&i ,&j ,&c );
            map [i ][j ]=map [j ][i ]=c <map [i ][j ]?c :map [i ][j ];//重边
        }

      b [ 1 ]= 1 ;
      m =n - 1 ;
      while
(m --)
      {

          min = 0xffffff ;
          for
(i = 2 ;i <=n ;i ++)
            if
(!b [i ]&&map [ 1 ][i ]<min )
            {

                j =i ;
                min =map [ 1 ][i ];
            }

         b [j ]= 1 ;
         for
(i = 2 ;i <=n ;i ++)
           if
(!b [i ]&&map [ 1 ][j ]+map [j ][i ]<map [ 1 ][i ])
             map [ 1 ][i ]=map [ 1 ][j ]+map [j ][i ];
      }

      printf ( "%d\n" ,map [ 1 ][n ]);
    }

    return
0 ;
}

你可能感兴趣的:(HDU)