最短路径问题 C语言实现

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下测试通过

posted @ 2012-11-20 22:07  liushaobo  阅读(654)  评论(0编辑  收藏  举报