单源最短路径问题 Dijkstra 贪心法

一维数组d[i]中存放从原点s到结点i的当前最短路径的长度;

一维整型数组path[i]存放从原点到结点i的当前最短路径上,结点i的前一个结点。

程序如下:

#include<iostream>
#include<cmath>
#include<fstream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
using namespace std;
const int INFTY=2147483647-1000000;
const int N=100;
int a[N][N],n;  //a是有向图的邻接矩阵
int *d;
int *path;
int Choose(int *d,bool *s)
{
    int i,minpos,min;
    min=INFTY;minpos=-1;
    for(i=0;i<n;i++)
    {
        if(d[i]<min && !s[i]){
            min=d[i];
            minpos=i;
        }
    }
    return minpos;
}
void Dijkstra(int s,int* &d,int* &path)
{
    int k,i,j;
    if(s<0||s>n-1)  cout<<"OutOfBounds!";
    bool *inS=new bool[n+1];
    d=new int[n+1];
    path=new int[n+1];
    for(i=0;i<n;i++){      //初始化
        inS[i]=false;
        d[i]=a[s][i];
        if(i!=s && d[i]<INFTY) path[i]=s;
        else path[i]=-1;
    }
    inS[s]=true;d[s]=0;   //将原点加入S中
    for(i=1;i<n;i++)      //求n-1条最短路径
    {
        k=Choose(d,inS);  //选出下一条最短路径的结点k
        inS[k]=true;      //将k加入S中
        for(j=0;j<n;j++)  //更新d和path的值
            if(!inS[j] && d[k]+a[k][j]<d[j])
            {
                d[j]=d[k]+a[k][j];
                path[j]=k;
            }
    }
}
int main()
{
  //freopen("data.in","r",stdin);
    cout<<"输入结点个数: ";
    cin>>n;
    int s,t,w;
    cout<<"输入结点关系及权值(以Ctrl+Z结束): "<<endl;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
        a[i][j]=INFTY;
    while(cin>>s>>t>>w){
        a[s][t]=w;
    }
    cout<<endl;
    Dijkstra(0,d,path);
    for(int i=1;i<n;i++)
        cout<<"0到"<<i<<"最短路径: "<<d[i]<<" "<<path[i]<<endl;
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/Tobyuyu/p/4965365.html