一维数组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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。