Dijkstra 算法 c语言原生实现
2017-09-10 23:33
441 查看
// Dijkstra.cpp: 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include<limits.h> void Dijkstra(int n, int v, int distance[], int previous[], int **G) //distance 为起点到这个点的最短距离 // previous为每个节点的先序节点 { int * sign = (int *)malloc(sizeof(int)*n); for (int i = 0; i < n; i++)//初始化 { distance[i] = G[v][i];//到i的最短距离数组初始化 到达不了的节点为INT_MAX if (i == v) { sign[i] = 1; } else { sign[i] = 0; } if (G[v][i] == INT_MAX) { previous[i] = -1; } else { previous[i] = v;//起始节点的先序节点是它本身 } } for (int i = 0; i < n-1; i++)//n个节点,n-1次 { int temp = INT_MAX; int min_v=INT_MAX; for (int j = 0; j < n; j++) { if ((!sign[j]) && distance[j] < temp) //选出一个未处理而且距离初始节点最短的节点 { min_v = j; temp = distance[j]; } } sign[min_v] = 1; for (int j = 0; j < n; j++) { if ((!sign[j]) && G[min_v][j] < INT_MAX) //定点未处理且顶点可达 { int newdist = distance[min_v] + G[min_v][j]; //最短节点 + 这个节点的路径 产生的路经才有可能是最短的路径 if (newdist < distance[j]) { //更新源点通向j点的距离 distance[j] = newdist; previous[j] = min_v;//经过最短节点 min_v } } } } } void showPath(int start, int end, int n, int previous[]) { int *way = (int*)malloc(sizeof(int)*n);//路径数组 int previous_v=end; int count = 0; while (true) { way[count] = previous_v; count++; previous_v = previous[previous_v]; if (previous_v == start) { way[count] = previous_v; count++; break; } } printf("The start : %d The end %d\n", start, end); for (int i = count-1; i >=0; i--) { if(i==0) { printf("%d", way[i]); } else { printf("%d->", way[i]); } } printf("\n"); } int ** generateGraph(int n) { int ** Graph = (int**)malloc(sizeof(int *)*n); for (int i = 0; i < n; i++) { Graph[i] = (int*)malloc(sizeof(int)*n); } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i == j) { Graph[i][j] = 0; } else { Graph[i][j] = INT_MAX; } } } Graph[1][0] = 2; Graph[2][0] = 1; Graph[3][0] = 4; Graph[4][0] = 0; Graph[5][0] = 1; Graph[2][1] = 7; Graph[3][1] = 0; Graph[4][1] = 5; Graph[5][1] = 0; Graph[3][2] = 3; Graph[4][2] = 0; Graph[5][2] = 0; Graph[4][3] = 2; Graph[5][3] = 0; Graph[5][4] = 3; for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { Graph[i][j] = Graph[j][i]; } } return Graph; } int main() { int ** Graph = generateGraph(6); int * distance = (int*)malloc(sizeof(int)*6); int * previous = (int*)malloc(sizeof(int) * 6); Dijkstra(6, 2, distance, previous, Graph); for (int i = 0; i < 6; i++) { showPath(2, i, 6,previous); } system("pause"); return 0; }
相关文章推荐
- 数据结构之---C语言实现最短路径之Dijkstra(迪杰斯特拉)算法
- 数据结构之---C语言实现最短路径之Dijkstra(迪杰斯特拉)算法
- [算法]操作系统进程通信(预防死锁)算法 Dijkstra银行家算法 C语言实现
- Sunday 算法的 O-C语言实现
- 10个重要的算法C语言实现源代码:拉格朗日,牛顿插值,高斯,龙贝格,牛顿迭代,牛顿-科特斯,雅克比,秦九昭,幂法,高斯塞德尔
- C语言算法实现约瑟夫环1
- 算法-大数乘法(16进制)(C语言实现)
- 10个重要的算法C语言实现源代码
- FFT的C语言算法实现
- C语言对堆排序一个算法思路和实现代码
- 10个重要的算法C语言实现源代码:拉格朗日,牛顿插值,高斯,龙贝格,牛顿迭代,牛顿-科特斯,雅克比,秦九昭,幂法,高斯塞德尔
- 【算法】C语言实现的快速排序
- 数据结构之---C语言实现最小生成树之kruskal(克鲁斯卡尔)算法
- Dijkstra最短路径算法的java实现
- 《编程珠玑》第二章 “杂技算法” 和 “翻转算法” C语言实现
- C语言实现FIFO算法与LRU算法
- CRC16常见几个标准的算法及C语言实现
- 算法:求行列式 C语言实现
- FFT算法理解与c语言的实现
- 快速傅里叶算法 C语言实现