Dijkstra算法

#include<iostream>
#define INF 10000    //取合适的值作为无穷大表示无边
using namespace std;

int n=7; //顶点数
int G[7][7]=
{
    {INF,9,INF,INF,INF,INF,INF},
    {9,INF,12,5,INF,INF,7},
    {INF,12,INF,6,INF,INF,INF},
    {INF,5,6,INF,14,8,INF},
    {INF,INF,INF,14,INF,3,INF},
    {INF,INF,INF,8,3,INF,10},
    {INF,7,INF,INF,INF,10,INF}
}; //图的邻接矩阵
void Dijkstra(int v0)
{
    int minCostPer[n],join[n];//minCostPer[]存的是各个节点到起点的路径最小值
    int minValue,path[n];//path[]存的最短路径上,当前节点的前一个节点
    int v=v0;
    for(int i=0; i<n; i++)
    {
        minCostPer[i]=G[v][i];
        join[i]=0;
        if(G[v][i]<INF)
        {
            path[i]=v;
        }
        else
        {
            path[i]=-1;
        }
    }
    join[v]=1;//起点加入路径
    path[v]=-1;//起点没有前一个节点,标记为-1
    for(int i=0; i<n-1; i++)
    {
        minValue=INF;
        for(int j=0; j<n; j++)
        {
            if(join[j]==0&&minCostPer[j]<minValue)
            {
                minValue=minCostPer[j];
                v=j;
            }
        }
        join[v]=1;
        for(int j=0; j<n; j++)
        {
            if(join[j]==0&&G[v][j]<INF&&minCostPer[v]+G[v][j]<minCostPer[j])
            {
                minCostPer[j]=minCostPer[v]+G[v][j];
                path[j]=v;
            }
        }
    }

    for(int i=0; i<n; i++)
    {
        cout<<minCostPer[i]<<" ";
    }
}
int main()
{
    Dijkstra(0);//以符号标志为0的节点作为起点
    /*
        path[]里的元素值应为:-1 0 3 1 5 3 1
        minCostPer[]里的元素值应为:10000 9 20 14 25 22 16
    */
    return 0;
}

 

posted @ 2020-07-28 17:44  执着于风  Views(121)  Comments(0)    收藏  举报