天天看點

hdu 2544 最短路(floyd)

題目:​​http://acm.hdu.edu.cn/showproblem.php?pid=2544​​

最短路

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 43688    Accepted Submission(s): 19225

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&lt;=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      

分析:最短路問題,看見N<=100我就好開心,用最簡單的floyd算法(時間O(n^3),空間O(n^2),且沒有負邊)。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=110,inf=0x3f3f3f3f;
int n,m,map[maxn][maxn],pre[maxn][maxn],dis[maxn][maxn];
void floyd(){ //time O(n^3)  space O(n^2)
    int i,j,k;
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            dis[i][j]=map[i][j]; //實際可以直接在map上松弛。更簡單
            pre[i][j]=i;
        }
    }
    for(k=0;k<n;k++){
        for(i=0;i<n;i++){
           for(j=0;j<n;j++){
               dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);  //這和矩陣乘法的動态思想一緻
               pre[i][j]=pre[k][j];
           }
        }
    }
}
int main()
{
    //freopen("cin.txt","r",stdin);
    int i,j,a,b,c;
    while(cin>>n>>m&&(n+m)){
         for(i=0;i<n;i++){
              for(j=0;j<n;j++){
                  map[i][j]=(i==j?0:inf);
              }
         }
         for(i=0;i<m;i++){
             scanf("%d%d%d",&a,&b,&c);
             map[a-1][b-1]=map[b-1][a-1]=min(map[a-1][b-1],c);
         }
         floyd();
         printf("%d\n",dis[0][n-1]);
    }
    return 0;
}