最短路(例题为HDU 2544 各种最短路算法的实现),包括Dijkstra算法与Floyd算法

注明:文章为转载
首先上最简单的Floyd算法的代码:

#include<cstdio>
#include<cstring>
#include<utility>
#include<queue>
using namespace std;

const int N=105;
const int INF=2147483646;

int n, m, d[N][N];

 // 无向图的输入,注意每输入的一条边要看作是两条边

inline void read_graph(){
    for(int i=1; i<=n; ++i){
        d[i][i] = INF;
        for(int j=i+1; j<=n; ++j)
            d[i][j]=d[j][i]=INF;
    }
    int a,b,c;
    for(int e=1; e<=m; ++e){
        scanf("%d%d%d",&a,&b,&c);
        d[a][b]=d[b][a]=c;
    }
}

inline void Floyd(int src){                                  //三个循环是这个算法的核心
    for(int k=1; k<=n; ++k){                    
        for(int i=1; i<=n; ++i){
            for(int j=1; j<=n; ++j)
                if(d[i][k]<INF && d[k][j]<INF){  //防止溢出
                    d[i][j] = min(d[i][j], d[i][k]+d[k][j]);
                }
        }
    }
}

int main(){
    int a,b,c;
    while(~scanf("%d%d",&n,&m)&&n+m){
        read_graph();
        Floyd(1);
        printf("%d\n", d[1][n]);
    }
    return 0;
}

接下来是Dijkstra算法的代码:Dijkstra+邻接表(用数组实现)+优先队列优化

#include<cstdio>
#include<cstring>
#include<utility>
#include<queue>
using namespace std;

const int N=20005;
const int INF=9999999;

typedef pair<int,int>pii;
priority_queue<pii, vector<pii>, greater<pii> >q;

int d[N], first[N], u[N], v[N], w[N], next[N],n,m;
bool vis[N];


// 无向图的输入,注意每输入的一条边要看作是两条边
void read_graph(){
    memset(first, -1, sizeof(first)); //初始化表头
    for(int e=1; e<=m; ++e){
        scanf("%d%d%d",&u[e], &v[e], &w[e]);
        u[e+m] = v[e]; v[e+m] = u[e]; w[e+m] = w[e];  // 增加一条它的反向边

        next[e] = first[u[e]];  // 插入链表
        first[u[e]] = e;

        next[e+m] =first[u[e+m]]; // 反向边插入链表
        first[u[e+m]] = e+m;
    }
}

void Dijkstra(int src){
    memset(vis, 0, sizeof(vis));
    for(int i=1; i<=n; ++i) d[i] = INF;
    d[src] = 0;
    q.push(make_pair(d[src], src));
    while(!q.empty()){
        pii u = q.top(); q.pop();
        int x = u.second;
        if(vis[x]) continue;
        vis[x] = true;
        for(int e = first[x]; e!=-1; e=next[e]) if(d[v[e]] > d[x]+w[e]){
            d[v[e]] = d[x] + w[e];
            q.push(make_pair(d[v[e]], v[e]));
        } 
    }
}

int main(){
    int a,b,c;
    while(~scanf("%d%d",&n,&m)&&n+m){
        read_graph();
        Dijkstra(1);
        printf("%d\n", d[n]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41995906/article/details/81262895