Dijkstra算法解决最短路径问题
2015-09-18 14:15
435 查看
本文给出了用Dijkstra算法来解决最短路径问题的程序。
输入如下所示:
1 —————–测试用例个数
10 —————–本测试用例的点数
1 2 4 ——————第一个点和第二个点之间的距离是4.
1 3 8
2 3 3
2 4 4
2 5 6
3 4 2
3 5 2
4 5 4
4 6 9
5 6 4
代码如下:
输入如下所示:
1 —————–测试用例个数
10 —————–本测试用例的点数
1 2 4 ——————第一个点和第二个点之间的距离是4.
1 3 8
2 3 3
2 4 4
2 5 6
3 4 2
3 5 2
4 5 4
4 6 9
5 6 4
代码如下:
#include <stdio.h> #define MAX 6 #define MAX_VALUE 65536 typedef struct Node { int id; //节点id int distance; //到c1的距离 bool visited;//该点是否被访问 int parent; // 父节点 }Node; int v[MAX + 1][MAX + 1] = { 0 };//连接表 Node q[100]; //处理队列 int cur = 0; //尾指针 Node pts[MAX + 1];//标记每个点状态 void insert(Node it) { int i = 0; for (i = 0; i < cur; i++) { if (it.distance > q[i].distance) { break; } } for (int j = cur - 1; j >= i; j--) { q[j + 1] = q[j]; } q[i] = it; cur++; } void Dijkstra(int s) { for (int i = 1; i <= MAX; i++) { pts[i].id = i; pts[i].distance = MAX_VALUE; pts[i].visited = false; pts[i].parent = 0; } pts[s].distance = 0; q[cur++] = pts[s]; while (cur!=0) { cur--; Node c = q[cur]; if (pts[c.id].visited)continue; pts[c.id].visited = true; for (int i = 1; i <= MAX; i++) { if (i == c.id)continue; if (pts[i].visited)continue; if (v[c.id][i] == MAX_VALUE)continue; if (pts[i].distance > pts[c.id].distance + v[c.id][i]) { pts[i].distance = pts[c.id].distance + v[c.id][i]; pts[i].parent = c.id; insert(pts[i]); } } } } void initV(void) { for (int i = 1; i <= MAX; i++) for (int j = 1; j <= MAX; j++) { v[i][j] = MAX_VALUE; } } int a[10] = { 5, 3, 9, 8, 1, 2, 7, 6, 4, 0 }; void qsort(int begin, int end) { if (begin >= end)return; int left = begin; int right = end; int key = a[left]; while (left < right) { while ((left < right) && (a[right] <= key))right--; a[left] = a[right]; while ((left < right) && (a[left] >= key))left++; a[right] = a[left]; } a[left] = key; qsort(begin, left-1); qsort(left+1, end); } void printPathDijkstra() { for (int i = 1; i <= MAX; i++) { printf("%d %d\n", pts[i].id, pts[i].distance); } for (int i = 1; i <= MAX; i++) { int path[MAX] = {0}; int step = 0; int cur = i; do { path[step++] = cur; cur = pts[cur].parent; } while (cur != 0); for (int j = step - 1; j >= 0; j--) { printf("%d ", path[j]); } printf("\n"); } } int main(int argc, char** argv) { freopen("input.txt", "r", stdin); int N; scanf("%d\n", &N); qsort(0, 9); for (int case_num = 0; case_num < N; case_num++) { initV(); int line_num; scanf("%d\n", &line_num); for (int i = 0; i < line_num; i++) { int pt1, pt2, distance; scanf("%d %d %d", &pt1, &pt2, &distance); v[pt1][pt2] = distance; v[pt2][pt1] = distance; } Dijkstra(1); printPathDijkstra(); } }
相关文章推荐
- 正则
- iOS中的定时器实现图片的轮播
- SVN Client API的.net 接口 SharpSvn介紹 Checkout操作实例
- jQuery多选下拉框 multiselect 的使用
- 设置QTableWidget的左上角CornerWidget的文字(三)
- 通用分页工具类
- 把字符串转换成字典
- 飞鸽协议分析之上下线报文分析之二
- 二维码保存时看到是一张纯黑色图片问题
- LoadRunner中常用的C语言函数
- Error:IntelliSense: cannot open source "stdafx.h"
- android 美化zxing二维码扫描框
- 安卓(android)开发应该怎么学?需要哪些基础知识?
- Linux-CenOS7 Samba的安装与配置
- javascript 异步模块加载 简易实现
- bash编程之:case语句、read与用户交互
- 新人学ruby---方法的分类
- cocos2d-x 3.4 sprite3d c3b 模型无法显示的问题
- 压缩图片
- WebView基本使用