#include <stdio.h>
#include <stdlib.h>
#define MAXVEX 9
#define INFINITY 32767
typedef int Patharc[MAXVEX]; //存放最短路径上的结点编号
typedef int ShortPathTable[MAXVEX]; //各节点到源点的路径(经过中间结点)长度
struct MGraph{
int numVertexes;
int *vex;
int arc[MAXVEX][MAXVEX];
};
void ShortestPath_Dijkstra(MGraph *G,int v0,int vv,Patharc *P,ShortPathTable *D)
{
int v,w,k,min,t;
int result[MAXVEX];
int n=0;
t=G->numVertexes*G->numVertexes;
int i,j,cc[t];//cc为临时贮存
for(i=0;i<t;i++)
cc[i]=777;
i=0;
for(v=0;v<G->numVertexes;++v)
{
result[v]=0;
(*D)[v]=G->arc[v0][v]; //初始化,其余各节点到源点的距离
if((*D)[v]<INFINITY)(*P)[v]=v0;
else
(*P)[v]=-1;
}
(*D)[v0]=0;//源点到原点的距离
result[v0]=1; //源点加入
printf(" w min (*D)[w]\n");
printf("________________\n");
for(v=0;v<G->numVertexes;++v)
{
min=INFINITY;
for(w=0;w<G->numVertexes;++w) //寻找未加入的所有结点中到源点距离最短的结点k
{
if(!result[w] && (*D)[w]<min)
{
k=w;
min=(*D)[w];
printf("v%d%6d%8d\n",w,min,(*D)[w]);
cc[i++]=(*D)[w];
}
else
{
printf("v%d%6d%8d\n",w,min,(*D)[w]);
cc[i++]=(*D)[w];
}
}
result[k]=1; //结点k加入
printf("_ _ _ _ _ _ _ _ _\n");
for(w=0;w<G->numVertexes;++w) //更新其余各节点到源点的距离的距离数组
{
if(!result[w] && (min+G->arc[k][w]<(*D)[w])) //新节点w到源点的距离=k到源点的距离+k到w的距离
{
(*D)[w]=min+G->arc[k][w];
(*P)[w]=k;
}
}}
//输出结果
printf("终点 ");
for(i=0;i<G->numVertexes;i++)
printf(" i=%d",i+1);
for(i=0;i<G->numVertexes;i++){
printf("\n");
printf("v%d ",i+1);
for(j=0;j<G->numVertexes;j++)
if(cc[j*G->numVertexes+i]==INFINITY)
printf(" ∞");
else
printf("%8d",cc[j*G->numVertexes+i]);
}
printf("\n");
for(v=0;v<G->numVertexes;++v)
{
printf("Path[%d]=%d ",v,(*P)[v]);
}
printf("\n");
}
int main()
{
MGraph *my_g=(struct MGraph*)malloc(sizeof(struct MGraph));
int i,j;
int t=0;
int v0=0;
int vv=5;
my_g->numVertexes=6;
my_g->vex=(int*)malloc(sizeof(char)*my_g->numVertexes);
if(!my_g->vex) return 0;
for(i=0;i<my_g->numVertexes;++i){ //一维数组(图中各结点)初始化
my_g->vex[i]=i;
}
for(i=0;i<my_g->numVertexes;++i)
for(j=0;j<my_g->numVertexes;++j)
my_g->arc[i][j]=INFINITY;
my_g->arc[0][2]=10; my_g->arc[0][4]=30; my_g->arc[0][5]=100;
my_g->arc[1][2]=5;
my_g->arc[2][3]=50;
my_g->arc[3][5]=10;
my_g->arc[4][3]=20; my_g->arc[4][5]=60;
for(i=0;i<my_g->numVertexes;++i) //二维数组表示图中各结点间连接边的weight
{
for(j=0;j<my_g->numVertexes;++j)
printf("%5d ",my_g->arc[i][j]);
printf("\n");
}
printf("\n\n");
Patharc P;
ShortPathTable D;
ShortestPath_Dijkstra(my_g,v0,vv,&P,&D);
free(my_g->vex);
}
输入的图
输出的表
结果