构建图 ,求出v1与其他各个点的最短路径。
代码内容如下:
#include"stdio.h"
#include"stdlib.h"
#define INFINITY 10000000
#define MAX_VERTAX_NUM 6
#define FALSE 0
#define TRUE 1
//typedef enum{DG,DN,UDG,UDN}GraphKind;
typedef struct ArcCell{
int adj;
int *info;
}ArcCell,AdjMatrix[MAX_VERTAX_NUM][MAX_VERTAX_NUM];
typedef struct{
int vexs[MAX_VERTAX_NUM];
AdjMatrix arcs;
int vexnum,arcnum;
//GraphKind kind;
}MGraph;
int D[6];
int path[6][6];
int final[6];
//**************图的表示方式--数组表示法************
void CreatDG(MGraph &G)
{
int i,j,k,v1,v2,w;
printf("请输入顶点数,边数:\n");
scanf("%d%d",&G.vexnum,&G.arcnum);
for(i=0;i<G.vexnum;i++) G.vexs[i]=i;
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
{
G.arcs[i][j].adj=INFINITY;
G.arcs[i][j].info=NULL;
}
printf("输入每条边依附的两个顶点和这条边的大小:\n");
for(k=0;k<G.arcnum;k++)
{
scanf("%d%d%d",&v1,&v2,&w);
v1--;v2--;
G.arcs[v1][v2].adj=w;
}
}
//****************迪杰斯特拉算法**************************
void ShortestPath_DIJ(MGraph G,int v0)
{
int w,v,i,min;
for(v=0;v<G.vexnum;v++)
{
final[v]=FALSE;
D[v]=G.arcs[v0][v].adj;
for(w=0;w<G.vexnum;w++) path[v][w]=FALSE;
if(D[v]<INFINITY) {
path[v][v0]=TRUE; path[v][v]=TRUE;
}
}
D[v0]=0;
final[v0]=TRUE;
for(i=1;i<G.vexnum;i++)
{
min=INFINITY;
for(w=0;w<G.vexnum;w++)
if(!final[w])
if(D[w]<min) {
v=w;min=D[w];
}
final[v]=TRUE;
for(w=0;w<G.vexnum;w++)
if(!final[w]&&(min+G.arcs[v][w].adj<D[w])){
D[w]=min+G.arcs[v][w].adj;
for(int j=0;j<G.vexnum;j++)
path[w][j]=path[v][j];
path[w][w]=TRUE;
}
}
}
int main()
{
MGraph G;
CreatDG(G);
ShortestPath_DIJ(G,0);
for(int i=0;i<G.vexnum;i++)
{
printf("v1到v%d的路径为:",i+1);
for(int j=0;j<G.vexnum;j++)
if(path[i][j]!=0) printf("%d ",j+1);
printf("其长度为:");
if(D[i]==INFINITY) printf("NULL \n");
else printf("%d \n",D[i]);
}
printf("\n");
return 0;
}
示例图:(A为v1,B为v2,C为v3,D为v4,E为v5,F为v6)
运行结果如下: