2013-11-18 图专题之01Dijkstra算法(思维逻辑题)
2013-11-18 22:58
260 查看
题目
程序实现图的Dijkstra算法
注意事项
图的存储采用矩阵结构
本算法算出了所有顶点到其余各顶点的最小路径。
本算法时间复杂度O(n*n*n)
本算法空间复杂度O(n*n)
程序实现
程序实现图的Dijkstra算法
注意事项
图的存储采用矩阵结构
本算法算出了所有顶点到其余各顶点的最小路径。
本算法时间复杂度O(n*n*n)
本算法空间复杂度O(n*n)
程序实现
#include<stdio.h> #include<stdlib.h> int vertix_num; unsigned int **graph_weight; unsigned int **graph_distance; unsigned int vertix_count; unsigned int **source_vertix; void output_graph() { int i; int j; for( i = 0; i < vertix_num;i++){ for(j = 0; j < vertix_num; j++){ printf("%-4d ", graph_weight[i][j]); } printf("\n"); } } void output_distance() { int i; int j; for( i = 0; i < vertix_num;i++){ for(j = 0; j < vertix_num; j++){ printf("%-4d ", graph_distance[i][j]); } printf("\n"); } } int is_in_source_vertix(int source_id, int temp) { int i; for(i = 0; i < vertix_count;i++){ if(source_vertix[source_id][i] == temp){ return 0; } } return 1; } void generate_minest_diatance(int source_id) { int i; int j; int min =100000; int temp; int vetix1; int vetix2; int flag = 0; for( i = 0; i < vertix_count;i++){ temp = source_vertix[source_id][i]; for(j = 0; j < vertix_num; j++){ if(graph_weight[temp][j] > 0 && graph_distance[source_id][temp]+graph_weight[temp][j] < min && is_in_source_vertix(source_id, j)){ min = graph_weight[temp][j]; vetix2 = j; vetix1 = temp; flag = 1; } } } if(flag == 0){ return; } source_vertix[source_id][vertix_count++] = vetix2; graph_distance[source_id][vetix2] = graph_distance[source_id][vetix1] + min; generate_minest_diatance(source_id); } void produce_the_graph() { source_vertix = (unsigned int **)malloc(sizeof(int* ) * vertix_num); graph_weight = (unsigned int **)malloc(sizeof(int *) * vertix_num); graph_distance = (unsigned int **)malloc(sizeof(int *) * vertix_num); int i; for(i = 0; i < vertix_num; i++){ source_vertix[i] = (unsigned int *)malloc(sizeof(int ) * vertix_num); graph_weight[i] = (unsigned int *)malloc(sizeof(int ) * vertix_num); graph_distance[i] = (unsigned int *)malloc(sizeof(int ) * vertix_num); } int j; for(i = 0; i < vertix_num; i++){ for(j = 0; j< vertix_num; j++){ scanf("%d", &graph_weight[i][j]); graph_distance[i][j] = 0; } } //output_graph(); for(i = 0; i < vertix_num; i++){ vertix_count = 0; source_vertix[i][vertix_count++] = i; generate_minest_diatance(i); } } void free_mem() { int i; for(i = 0; i < vertix_num; i++){ free(graph_weight[i]); free(source_vertix [i]); free(graph_distance[i]); } free(graph_weight); free(source_vertix); free(graph_distance); } int main(void) { printf("1000 means +OO\n"); scanf("%d", &vertix_num); produce_the_graph(); printf("\nthe minest distance arry is :\n"); output_distance(); free_mem(); }
相关文章推荐
- 逻辑指的是思维的规律和规则,是对思维过程的抽象。
- 减少存储过程封装业务逻辑-web开发与传统软件开发的思维模式不同
- 思维逻辑面试题
- 计算机程序的思维逻辑 (11) - 初识函数
- 2013-11-04 实验之取球游戏(递推思想,数学归纳思想,思维逻辑思想)
- POJ2976 - Dropping tests - 二分+01分数规划+思维
- 用react的思维考虑网页用户登陆的逻辑
- 计算机程序的思维逻辑 (15) - 初识继承和多态
- hdu 5610 Baby Ming and Weight lifting(思维,逻辑)
- (47)堆和PriorityQueue的应用 / 计算机程序的思维逻辑
- 51nod 1557 两个集合 (二分搜索,思维逻辑好题)
- hdu 3466 (01背包+思维排序)
- hdu 6092 Rikka with Subset(逆向01背包+思维)
- SDAU 贪心专题 01 小木棍
- 泛型 (上) - 基本概念和原理 / 计算机程序的思维逻辑
- 无线安全专题01--kali破解WPA
- 计算机程序的思维逻辑- 函数调用的基本原理
- ArcGIS Engine开发之旅01---产品组成、逻辑体系结构
- 计算机程序的思维逻辑 (13) - 类
- 计算机程序的思维逻辑(挺好的文章列表)