#include <stdio.h>
#define INFINITY 255
#define TRUE 1
#define FALSE 0
#define MAX 6
typedef struct MGraph
{
char vexs[MAX];
int arcs[MAX][MAX];
int vexnum;
int arcnum;
}MGraph;
void ShortestPath(MGraph g,int v0,int p[][MAX],int D[])
{
int v;
int w;
int min;
int i,j;
int final[MAX];
for (v = 0; v < g.vexnum; v++)
{
final[v] = FALSE;
D[v] = g.arcs[v0][v];
for (w = 0; w < g.vexnum; w++)
{
p[v][w] = -1;
}
if (D[v] < INFINITY)
{
p[v][v0] = v;
}
}
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] < D[w]) )
{
D[w] = min + g.arcs[v][w];
for (j = 0; j <MAX; j++)
{
p[w][j] = p[v][j];
}
p[w][v] = w;
}
}
}
}
void main()
{
int i,j;
MGraph g;
int p[MAX][MAX];
int d[MAX];
int v0;
g.vexs[0]='A',g.vexs[1]='B',g.vexs[2]='C',g.vexs[3]='D',g.vexs[4]='E',g.vexs[5]='F';
printf("输入带权邻接矩阵:/n");
for(i=0;i<MAX;i++)
for(j=0;j<MAX;j++)
g.arcs[i][j]=INFINITY;
g.arcs[0][2]=10,g.arcs[0][4]=30,g.arcs[0][5]=100,g.arcs[1][2]=5,
g.arcs[2][3]=50,g.arcs[3][5]=10,g.arcs[4][3]=20,g.arcs[4][5]=60;
g.vexnum=g.arcnum=MAX;
for(i=0;i<MAX;i++)
{
printf("%c/t",g.vexs[i]);
for(j=0;j<MAX;j++)
{
printf("%5d ",g.arcs[i][j]);
}
printf("/n");
}
printf("/n");
v0 = 0;
ShortestPath(g,v0,p,d);
for (i = 0; i < g.vexnum; i++)
{
printf("节点 %c 到 %c 的路径:/n",g.vexs[v0],g.vexs[i]);
if ( p[i][v0] != -1 )
{
for (j = v0; j != -1; j = p[i][j])
{
if (j != v0)
printf("→");
printf("%c",g.vexs[j]);
}
printf("/n");
}
printf("长度:%d/n",d[i]);
printf("/n");
}
}
这是一个固定带权数的图