hdu 2544 最短路(floyd模板題||Dijkstra模板題)

題目鏈接: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;
} 
發佈了37 篇原創文章 · 獲贊 7 · 訪問量 8722
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章