題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2544
題目大意:中文,十分明確不再重複
思路:floyd模板,數據合理最大,時間複雜度(n^3)
Dijkstra模板,時間複雜度(n^2)(這裏我就不詳細的講這兩個算法了,不會的可以通過去看數據結構書或者去找博客~
奇怪的是時間都是31ms
Dijkstra
floyd
//floyd
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<set>
const int maxn = 30000;
using namespace std;
int map[200][200];
int main(){
int n,m,a,b,c;
while(~scanf("%d%d",&n,&m),n+m){
memset(map,maxn,sizeof(map));
for(int i = 0 ; i < m ;i++){
scanf("%d%d%d",&a,&b,&c);
map[a][b]=map[b][a]=c;
}
for(int k = 1; k <= n ;k++)
for(int i =1; i <= n; i++)
for(int j = 1; j <= n ; j++)
map[i][j] = min(map[i][j] , map[i][k] + map[k][j]);
printf("%d\n",map[1][n]);
}
return 0;
}
//Dijkstra
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<set>
#include<stack>
#include<ctime>
#include<queue>
#define LOCAL
#define mst(a,b) memset(a,b,sizeof(a))
const int INF = 0x3f3f3f3f;
const int maxn = 30000;
using namespace std;
int map[200][200] , p[210] , d[210];//d數組存放的是v0到i的最短路徑長,p數組存放的是這個節點最短路徑時的前驅
void Dijkstra(int v0 , int n){
int v , k , min;
int flag[210];
mst(flag,0);//標記有沒有訪問過這個點
for(int i = 1 ; i <= n ; i++)//v0到i的距離
d[i] = map[v0][i];
d[v0] = v0; flag[v0] = 1;
for(int i = 2 ; i <= n ; i++){//求得v0到i的最短路徑
min = INF;
for(int w = 1 ; w <= n ; w++)//尋找離v0最近的點
if(!flag[w]& d[w] < min){
k = w;
min = d[w];
}
flag[k] = 1;//找到最近的點,並標誌已經訪問過
for(int w = 1 ; w <= n ; w++)//修正最短路,並記錄前驅
if(!flag[w] & (min + map[k][w] < d[w])){
d[w] = min + map[k][w];
p[w] = k;
}
}
}
int main(){
/*#ifdef local
freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
#endif*/
int n,m,a,b,c;
while(~scanf("%d%d",&n,&m),n+m){
mst(map,maxn);
mst(p,0);
for(int i = 0 ; i < m ;i++){
scanf("%d%d%d",&a,&b,&c);
map[a][b]=map[b][a]=c;
}
Dijkstra(1,n);
printf("%d\n",d[n]);
}
return 0;
}