Dijkstra算法

View Code
1 /*
2 The Greedy Approach
3 The Shortest Path Problem
4 Time: 2012-11-19 17:56:57
5 Input: A weighted directed graph G = (V,E), where V = {1,2,...,n}.
6 Output: The distance from vertex 1 to every other vertex in G.
7 */
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <limits.h>
11 #include <stdbool.h>
12
13 typedef struct graph{
14 int **matrix; //图的邻接矩阵
15 int vertex; //图的顶点数
16 int edge; //图的边数
17 }Graph;
18
19 void CreareGraph(Graph *g){
20 //采用邻接矩阵存储结构,构造有向图
21 int vertex, edge;
22 int i, j;
23 int begin, end, weight;
24
25 printf("Please enter the values of vertex and edge:\n");
26 scanf("%d %d", &vertex, &edge);
27 if (vertex>0 && edge > 0){
28 (*g).vertex = vertex;
29 (*g).edge = edge;
30 (*g).matrix = (int **)malloc(sizeof(int *) * (*g).vertex); //为图的邻接矩阵分配空间
31 if (NULL == (*g).matrix){
32 printf("Memory allocation failed. Goodbye.");
33 exit(EXIT_FAILURE);
34 }
35 for (i=0; i<(*g).vertex; ++i){
36 (*g).matrix[i] = (int *)malloc(sizeof(int) * (*g).vertex);
37 if (NULL == (*g).matrix[i]){
38 printf("Memory allocation failed. Goodbye.");
39 exit(EXIT_FAILURE);
40 }
41 }
42
43 for (i=0; i<(*g).vertex; ++i) //初始化矩阵
44 for(j=0; j<(*g).vertex; ++j)
45 (*g).matrix[i][j] = INT_MAX; //将图的顶点间权值初始化为无穷大
46 printf("Please input vertexs and weights between vertexs:\n");
47 for (i=0; i<(*g).edge; ++i){
48 scanf("%d %d %d", &begin, &end, &weight);
49 (*g).matrix[begin][end] = weight;
50 }
51 }
52 else{
53 printf("Illegal vertices or edge number.");
54 exit(EXIT_FAILURE);
55 }
56 }
57
58 void Dijkstra(Graph const *g, int *dist){
59 int i, j;
60 bool *visited = NULL;
61 int min = INT_MAX;
62 int nth;
63
64
65 dist[0] = 0;
66 for (i=1; i<(*g).vertex; ++i)
67 dist[i] = (*g).matrix[0][i];
68 /*for (i=0; i<(*g).vertex; ++i)
69 printf("%d ", dist[i]);
70 putchar('\n');*/
71 visited = (bool *)malloc(sizeof(bool) * (*g).vertex); //记录节点是否被访问过
72 if (NULL == visited){
73 printf("Memory allocation failed. Goodbye.");
74 exit(EXIT_FAILURE);
75 }
76 for (i=0; i<(*g).vertex; ++i) //初始化节点均未被访问过
77 visited[i] = false;
78
79 visited[0] = true;
80 for (i=1; i<(*g).vertex; ++i){
81 for (j=1; j<(*g).vertex; ++j){ //找到最小的dist[j]
82 if (visited[j] == false && dist[j] <= min){
83 min = dist[j];
84 nth = j;
85 }
86 }
87 min = INT_MAX; //min被重新赋值为INT_MAX
88 visited[nth] = true;
89 for (j=1; j<(*g).vertex; ++j){
90 if ( visited[j] == false && //如果该节点尚未被访问
91 (*g).matrix[nth][j]!=INT_MAX && //nth与j节点连通
92 dist[nth]+(*g).matrix[nth][j]<dist[j] ) //且…………
93 dist[j] = dist[nth]+(*g).matrix[nth][j]; //更新dist[j]
94 }
95 }
96 }
97
98 void ShowDist(int const *dist, int n){
99 int i;
100 printf("The Shortest Path(form the first vertex to others):\n");
101 for (i=0; i<n; ++i)
102 printf("%d ", dist[i]);
103 putchar('\n');
104 }
105
106 int main(int argc, char *argv[])
107 {
108 Graph g;
109 int *dist = NULL;
110 int n;
111 int i, j;
112
113 CreareGraph(&g);
114 /*for (i=0; i<g.vertex; ++i)
115 for (j=0; j<g.vertex; ++j)
116 if (g.matrix[i][j] != INT_MAX)
117 printf("%d ", g.matrix[i][j]);
118 putchar('\n');*/
119 dist = (int *)malloc(sizeof(int) * g.vertex); //为存储最短路径的数组分配空间
120 if (NULL == dist){
121 printf("Memory allocation failed. Goodbye.");
122 exit(EXIT_FAILURE);
123 }
124 Dijkstra(&g, dist);
125 n = g.vertex;
126 ShowDist(dist, n);
127
128 free(dist);
129 for (i=0; i<n; ++i)
130 free(g.matrix[i]);
131 free(g.matrix);
132
133 return 0;
134 }
在gcc 4.6.2和visual studio 2012下测试通过