单源最短路径问题 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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
posted on 2015-05-23 19:33 Tob__yuhong 阅读(167) 评论(0) 编辑 收藏 举报