#include
#include
#include
#include
#define MAX 100
#define NO 0xFFFFFF
typedef struct Graph
{
int arcnum;
int vexnum;
char vextex[MAX][20];
int matrix[MAX][MAX];
}Graph;
void print_graph(Graph* g)
{
for (int i = 0; i < g->vexnum; i++)
{
printf("\t%s", g->vextex[i]);
}
printf("\n");
for (int i = 0; i < g->vexnum; i++)
{
printf("%s\t", g->vextex[i]);
for (int j = 0; j < g->vexnum; j++)
{
if (g->matrix[i][j] == NO)
{
printf("NO\t");
}
else
{
printf("%d\t", g->matrix[i][j]);
}
}
printf("\n");
}
}
void graph_dijkstra(Graph* g, int in, int dist[])
{
int flag[MAX];
int path[MAX];
for (int i = 0; i < g->vexnum; i++)
{
flag[i] = 0;
dist[i] = g->matrix[in][i];
path[i] = in;
}
flag[in] = 1;
dist[in] = 0;
int min;
int j;
int k;
for (int i = 1; i < g->vexnum; i++)
{
min = NO;
for (j = 1; j < g->vexnum; j++)
{
if (flag[j] == 0 && dist[j] < min)
{
min = dist[j];
k = j;
}
}
flag[k] = 1;
for (j = 1; j < g->vexnum; j++)
{
if (flag[j] == 0 && min + g->matrix[k][j] < dist[j])
{
dist[j] = min + g->matrix[k][j];
path[j] = k;
}
}
}
for (int i = 1; i < g->vexnum; i++)
{
printf("从%s到%s的最短路径长度为%2d\t",g->vextex[in],g->vextex[i],dist[i]);
printf("路径为:%s\t",g->vextex[in]);
char stack[MAX][20];
int top = -1;
int prev = path[i];
while (prev != in)
{
strcpy_s(stack[++top], 20, g->vextex[prev]);
prev = path[prev];
}
while (top != -1)
{
printf("%s\t",stack[top--]);
}
printf("%s\n",g->vextex[i]);
}
}
int main(int argc, char* argv[])
{
Graph g =
{ 9,6,{"A","B","C","D","E","F"},
{
{NO,NO,5,30,NO,NO},
{2,NO,NO,NO,8,NO},
{NO,15,NO,NO,NO,7},
{NO,NO,NO,NO,NO,NO},
{NO,NO,NO,4,NO,NO},
{NO,NO,NO,10,18}
}
};
print_graph(&g);
int in = 0;
int dist[MAX] = { 0 };
graph_dijkstra(&g, in, dist);
return 0;
}

