本文将一个课本上的JAVA程序改写为用C++进行实现。 具体的内容为下面的函数部分 #include <iostream.h> /* 函数功能: a[i][j]存储边i到边j之间的权值, dist[i]存储源点到顶点i之间的最短距离 s[i]存储当前的顶点是否已经在集合中 prev[i]存储当前i顶点要取得最短距离时它要经过的前一个结点。 n表示当前顶点的个数。 必须注意的一个问题就是变量名必须统一,在处理的过程中出现了部分错误 另一个问题就是在C++中如何向子函数中传递一个二维数组。 */ void dijkstra(int v,float (*a)[6],float *dist,int *prev,int n) { int i; if(v<1||v>n) return; bool *s=new bool[n+1]; for(i=1;i<=n;i++) { dist[i]=a[v][i]; s[i]=false; if(dist[i]==10000) prev[i]=0; else prev[i]=v; } dist[v]=0; s[v]=true; for(int i1=1;i1<n;i1++) { float temp = 10000; int u = v; for(int j=1;j<=n;j++) { if((!s[j])&&(a[u][j]<temp)) { u=j; temp=dist[j]; } } s[u]=true; for(i=1;i<=n;i++) { if((!s[i])&&(a[u][i]!=10000)) { float newdist=dist[u]+a[u][i]; if(newdist<dist[i]) { dist[i]=newdist; prev[i]=u; } } } } } int main(void) { int i,k; float (*a)[6]=new float[6][6]; float *dist=new float[6]; int *prev = new int[6]; int n = 6; for(i=1;i<6;i++) { prev[i]=1; dist[i]=10000; for(int j=1;j<6;j++) { a[i][j]=10000; } } a[1][2]=10; a[1][4]=30; a[1][5]=100; a[2][3]=50; a[3][5]=10; a[4][3]=20; a[4][5]=60; dijkstra(1,a,dist,prev,5); for(i =2;i<6;i++) { cout<<dist[i]<<endl; } cin>>k; return 0; }