Dijkstra求图的最短路径

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#define maxdist 9999//距离无穷远
#define MAX 100//图中结点数目最大值
using namespace std;
struct a{
    int v,n;//v是结点个数,n是边的个数
    int adj[MAX][MAX];//邻接矩阵     
}Graph;
int sure[MAX];
int dist[MAX];
int aim;

void dijkstra(int v0){//v0是结点编号,某人编号是从1开始的,所以我之后的矩阵要去掉0 
    //v是结点个数(1~n) n是边的个数 adj是邻接矩阵
    dist[v0]=0;
    sure[v0]=1; //标记当前结点已经确定了最短路径
    for(int i=1;i<=Graph.v;i++){//初始化dist 
        if(i!=v0){
            dist[i]=Graph.adj[v0][i];
        }
    }
    for(int j=2;j<=Graph.v;j++){
        //找dist里面最小的  进行更新
        int min=maxdist;
        int subscript;
        for(int i=1;i<=Graph.v;i++){//从未确定的结点中找最小的 
            if(sure[i]==0&&dist[i]<min){
                min=dist[i];
                subscript=i;
            }
        } 
        //结点subcript已经确定   
        sure[subscript]=1;
        //用新标记的结点来更新  dist中未确定的结点
        for(int i=1;i<=Graph.v;i++){
            if(sure[i]==0&&Graph.adj[subscript][i]+min<dist[i]){//当前结点不确定  且距离可以缩小 
                dist[i]=Graph.adj[subscript][i]+min;
            }
        } 
    }
    
}
int main(){//矩阵和数组都是从1开始 

    //memset(sure,0,sizeof(int));
    cin>>Graph.v>>Graph.n;
    //接收每一条边,然后赋值邻接矩阵 
    for(int i=1;i<=Graph.v;i++){
        for(int j=1;j<=Graph.v;j++){
            Graph.adj[i][j]=maxdist;
        }
    }
    for(int i=0;i<Graph.n;i++){
        int x,y;
        cin>>x>>y;
        cin>>Graph.adj[x][y];
        Graph.adj[y][x]=Graph.adj[x][y];    
    } 
    //邻接矩阵赋值完毕  接收起始结点aim 
    //for(int i=1;i<=Graph.v;i++){
//        for(int j=1;j<=Graph.v;j++){
//            if(j==1) cout<<Graph.adj[i][j];
//            else cout<<" "<<Graph.adj[i][j];
//        }
//        cout<<endl;
//    }
    cin>>aim;
    dijkstra(aim);
    for(int i=1;i<=Graph.v;i++){
        cout<<i<<": "<<dist[i]<<endl;
    }
} 

dist[i] 保存目标起点v0到结点i的路径长短,将不断更新。

sure[i] =1表示此时dist[i]的值是 v0到结点i的最短路径长度

原文地址:https://www.cnblogs.com/Elaine-DWL/p/6575994.html