这个也是最短路径算法,在严巍敏的书上也有提到过,具体的思想忘记了,(老了*0*)和FLOYD算法做个对照,记得他们各有优缺点,一个是从全局出发,一个是从局部生成的。很强大的算法。
C代码如下:
#include<stdio.h>
#define INF 32767
#define FALSE 0
#define TRUE 1
#define MAXN 8
typedef int AdjMatrix[MAXN][MAXN];
typedef struct {
int vexnum;
AdjMatrix Arcs;
}
Graph;
void printD(double D[]);
void printP(int P[][MAXN]);
void ShortestPath(Graph G,int v0,double dist[],int path[][MAXN]) {
int i,j,u,w;
int s[MAXN];
double min;
for (i=0;i<G.vexnum;i++) {
dist=G.Arcs[v0];
s=0;
if(dist<INF) path[0]=v0;
}
path[v0][1]=v0;
s[v0]=1;
dist[v0]=0;
for (i=0;i<G.vexnum;i++) {
min=INF;
u=v0;
for (j=0;j<G.vexnum;j++)
if(s[j]==0&&dist[j]<min) {
min=dist[j];
u=j;
}
s=1;
for (w=0;path[w]>-1&&w<G.vexnum;w++);
if(path[w-1]!=u)path[w]=u;
for (j=0;j<G.vexnum;j++) if(s[j]==0&&min+G.Arcs[j]<dist[j]) {
dist[j]=min+G.Arcs[j];
for (w=0;w<G.vexnum;w++)path[j][w]=path[w];
for (w=0;path[j][w]!=-1&&w<G.vexnum;w++);
path[j][w]=j;
}
//if
}
//for
}
void printD(double D[]) {
int i;
printf("/n");
for (i=0;i<MAXN;i++) {
printf("%1.1f/t",*(D+i));
}
}
void printP(int P[][MAXN]) {
int i,j;
printf("/n");
for (i=0;i<MAXN;i++) {
printf("/n");
for (j=0;j<MAXN;j++) printf("%d/t",P[j]);
}
}
void InitP(int P[][MAXN]) {
int i,j;
for (i=0;i<MAXN;i++) for (j=0;j<MAXN;j++) P[j]=-1 ;
}
void main() {
Graph G;
FILE *fp;
int i,j;
double D[MAXN]= {
0
}
;
int P[MAXN][MAXN];
InitP(P);
G.vexnum=MAXN;
fp=fopen("Dijkstra.dat","r");
if(!fp)
printf("/nFILE OPEN ERROR!");
else
printf("/nFILE OPEN SUCCESS!");
for (i=0;i<MAXN;i++)
for (j=0;j<MAXN;j++)
fscanf(fp,"%d",&G.Arcs[j]);
ShortestPath(G,0,D,P);
printf("%d",G.vexnum);
printD(D);
printP(P);
getch();
}