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

来源:互联网 发布:帝国cms养生采集规则 编辑:程序博客网 时间:2024/05/21 08:43

一维数组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;}

0 0
原创粉丝点击