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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544
题目大意:中文,十分明确不再重复
思路:floyd模板,数据合理最大,时间复杂度(n^3)
Dijkstra模板,时间复杂度(n^2)(这里我就不详细的讲这两个算法了,不会的可以通过去看数据结构书或者去找博客~
奇怪的是时间都是31ms
Dijkstra 这里写图片描述
floyd 这里写图片描述

//floyd
#include
#include
#include
#include
#include
#include
#include
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
#include
#include
#include
#include
#include
#include
#include
#include
#include
#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;
} 

你可能感兴趣的:(算法训练,最短路)