Skip to content

一般实现

cpp
#include <bits/stdc++.h>
using namespace std;
#define NODE_NUM 5
#define M 1000
#define ERROR -1
#define INT32_MAX 1000

typedef struct GNode *PtrToGnode;
struct GNode{
    int nv = 5;
    int ne = 6;
    int Graph[NODE_NUM][NODE_NUM];
};
typedef PtrToGnode MGraph;

int FindMinDist(MGraph Graph, int dist[],int collected[]){
    int min_v, v;
    int min_dist = INT32_MAX;

    for(v = 0;v < Graph->nv;v++){
        if(collected[v] == false && dist[v]<min_dist){
            min_dist = dist[v];
            min_v = v;
        }
    }

    if(min_dist < INT32_MAX){
        return min_v;
    }else{
        return ERROR;
    }
}

bool dij(MGraph G, int dist[], int path[], int s){//s:start point
    int collected[G->nv];
    int v, w;
    //init
    for(v = 0;v < G->nv;v++){
        dist[v] = G->Graph[s][v];//init distance
        if(dist[v] < INT32_MAX){//对于源点邻接点来说,设置path,因为是从邻接矩阵第一行中获取的数据,等于MAX的事实上就是与源点不连通的点
            path[v] = s;
        }else{
            path[v] = -1;
        }
        collected[v] = false;//未收录除源点外的所有点。
    }
    dist[s] = 0;
    collected[s] = true;//初始化源点距离,收录

    while(1){
        v = FindMinDist(G,dist,collected);
        if(v == ERROR){
            break;
        }

        collected[v] = true;
        for(w = 0;w<G->nv;w++){
            if(G->Graph[v][w] < 0){
                return false;//dijkstra不允许存在负边
            }
            if(dist[v] + G->Graph[v][w] < dist[w]){//更新距离和前向点
                dist[w] = dist[v] + G->Graph[v][w];
                path[w] = v;
            }
        }
    }
    return true;
}

int main(int argc, char const *argv[])
{
    MGraph G = new struct GNode;
    G->nv = 5;
    G->ne = 6;
    int map[NODE_NUM][NODE_NUM] = 
        {
            {M,1,2,M,2},
            {1,M,M,3,M},
            {2,M,M,5,M},
            {M,3,5,M,4},
            {2,M,M,4,M}
        };
    //使用memcpy将map拷贝到G->Graph
    memcpy(G->Graph,map,sizeof(int)*NODE_NUM*NODE_NUM);

    int dist[NODE_NUM] = {0};
    int path[NODE_NUM] = {0};
    dij(G,dist,path,0);
    return 0;
}

堆优化

https://www.luogu.com.cn/problem/P4779

链式前向星

[[算法/数据结构/图#链式前向星]]