題目: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<=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;
}