利用邻接矩阵来演示dijkstra
直接上code吧
#include <stdio.h>
#include <stdlib.h>
#define MAX 1000
#define VertexNum 7
#define EdgeNum 9
int g_graph[VertexNum][VertexNum] = {0};
int g_edge[EdgeNum][3] = {
{1, 2, 6}, {1, 3, 3}, {2, 4, 5},
{3, 2, 2}, {3, 4, 3}, {3, 5, 4},
{4, 6, 3}, {5, 4, 2}, {5, 6, 5}};
int g_dijk_visited[VertexNum] = {0};
int g_dijk_distance[VertexNum] = {0};
void dijk_create_graph(int v1, int v2, int weight)
{
g_graph[v1][v2] = weight;
}
void dijk_print_graph()
{
int i, j;
printf("Vertice");
for (i = 1; i < VertexNum; i++)
printf("%8d", i);
printf("\n");
for (i = 1; i<VertexNum; i++)
{
printf("%5d ", i);
for (j = 1; j < VertexNum; j++)
printf("%8d", g_graph[i][j]);
printf("\n");
}
}
void dijkstra(int _begin)
{
int min_edge;
int vertex;
int i, j;
int edges;
edges = 1;
g_dijk_visited[_begin] = 1;
for (i = 1; i < VertexNum; i++)
g_dijk_distance[i] = g_graph[_begin][i]; /*初始距离和*/
g_dijk_distance[_begin] = 0;
printf("Vertice");
for (i = 1; i < VertexNum; i++)
printf("%8d", i);
printf("\n");
while (edges < (VertexNum - 1))
{
edges++;
min_edge = MAX;
for (j = 1; j < VertexNum; j++)
{
/*顶点未查找过且最小边加权值比距离总和大*/
if (g_dijk_visited[j] == 0 && min_edge > g_dijk_distance[j])
{
vertex = j; /*最小边顶点*/
min_edge = g_dijk_distance[j]; /*最小边距离总和*/
}
}
g_dijk_visited[vertex] = 1;
printf("Step %d:", edges);
for (j = 1; j < VertexNum; j++)
{
/*找出未查找顶点的最小距离总和*/
if(g_dijk_visited[j] == 0 &&
g_dijk_distance[vertex] + g_graph[vertex][j] < g_dijk_distance[j])
{
g_dijk_distance[j] = g_dijk_distance[vertex] + g_graph[vertex][j];
}
printf("%8d", g_dijk_distance[j]);
}
printf("\n");
}
}
int main(int argc, char **argv)
{
int i, j;
for(i = 0; i<VertexNum; i++)
{
for(j = 0; j < VertexNum; j++)
{
g_graph[i][j] = MAX;
}
}
for(i = 0; i < EdgeNum; i++)
dijk_create_graph(g_edge[i][0], g_edge[i][1], g_edge[i][2]);
dijk_print_graph();
printf("Dijkstra Algo:\n");
dijkstra(1);
return 0;
}