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

来源:互联网 发布:aes加密java代码 编辑:程序博客网 时间:2024/05/29 23:22

题目链接: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;} 
阅读全文
0 0
原创粉丝点击