#include<stdio.h>
#include<stdlib.h>
#define MAXVER 100
#define INFINITY 65535
typedef int Patharc[MAXVER];
typedef int ShortPathTable[MAXVER];
typedef struct MGraph
{
char vertex[MAXVER] ;
int arc[MAXVER][MAXVER] ;
int numVertexes, numEdges;
}MGraph;
void CreateGraph(MGraph *G)
{
int i, j,k,w;
printf("请输入图的顶点数,边数:\n");
scanf("%d %d", &G->numVertexes, &G->numEdges);
setbuf(stdin, NULL);
for (i = 0; i < G->numVertexes; i++)
{
printf("\n请输入第%d个顶点存储的值:",i);
scanf("%c", &G->vertex[i]);
setbuf(stdin, NULL);
}
for (i = 0; i < G->numVertexes; i++)
{
for (j = 0; j < G->numVertexes; j++)
{
if(i == j)
{
G->arc[i][j] = 0;
}
else
{
G->arc[i][j] = INFINITY;
}
}
}
for (k = 0; k < G->numEdges; k++)
{
printf("请输入边(vi,vj)的下标i,下标j对应的权w:");
scanf("%d %d %d", &i, &j, &w);
G->arc[i][j] = w;
G->arc[j][i] = G->arc[i][j];
}
}
void ShortestPath_Dijkstra(MGraph G ,int V0,Patharc *P,ShortPathTable *D)
{
int v,w,k,min;
int final[MAXVER];
for(v=0;v<G.numVertexes;v++)
{
final[v]=0;
(*D)[v] = G.arc[V0][v];
(*P)[v] = 0;
}
(*D)[V0] = 0;
final[V0] = 1;
for(v=1 ;v<G.numVertexes;v++)
{
min =INFINITY;
for(w=0;w<G.numVertexes;w++)
{
if(!final[w] && (*D)[w] <min)
{
k = w;
min = (*D)[w];
}
}
final[k] = 1;
for(w=0;w<G.numVertexes;w++)
{
if(!final[w] && min+G.arc[k][w]<(*D)[w])
{
(*D)[w] = min+G.arc[k][w];
(*P)[w] = k;
}
}
}
printf("\nD 数组的值:");
for(v=0 ;v<G.numVertexes;v++)
{
printf("%d ",(*D)[v]);
}
printf("\nP数组的值:");
for(v=0 ;v<G.numVertexes;v++)
{
printf("%d ",(*P)[v]);
}
printf("\nfinal数组的值:");
for(v=0 ;v<G.numVertexes;v++)
{
printf("%d ",final[v]);
}
}
int main()
{
MGraph G;
CreateGraph(&G);
Patharc P[MAXVER];
ShortPathTable D[MAXVER];
ShortestPath_Dijkstra(G,0,P,D);
system("pause");
return 0;
}