用迪杰斯特拉算法求赋权图中的最短路径
2016-03-25 22:32
411 查看
[align=left]描述[/align]
用迪杰斯特拉算法求一点到其余所有结点的最短路径。
[align=left]输入[/align]
先输入一个小于100的正整数n,然后的n行输入图的邻接矩阵(10000表示无穷大,即两点之间没有边),最后输入两个0到n-1的整数表示两个点,
[align=left]输出[/align]
用迪杰斯特拉算法求第一个点到其余所有结点的最短路径。
并输出这两个点之间的最短路径(按顺序输出最短路径上的每一个点,每个数据占一行)。
[align=left]输入样例[/align]
4
0 2 10 10000
2 0 7 3
10 7 0 6
1000 3 6 0
0 2
[align=left]输出样例[/align]
0
1
2
用迪杰斯特拉算法求一点到其余所有结点的最短路径。
[align=left]输入[/align]
先输入一个小于100的正整数n,然后的n行输入图的邻接矩阵(10000表示无穷大,即两点之间没有边),最后输入两个0到n-1的整数表示两个点,
[align=left]输出[/align]
用迪杰斯特拉算法求第一个点到其余所有结点的最短路径。
并输出这两个点之间的最短路径(按顺序输出最短路径上的每一个点,每个数据占一行)。
[align=left]输入样例[/align]
4
0 2 10 10000
2 0 7 3
10 7 0 6
1000 3 6 0
0 2
[align=left]输出样例[/align]
0
1
2
#include <iostream> #include <cstdio> #include <cstring> #include <stack> #include <stdlib.h> using namespace std; const int maxnum = 130; const int maxint = 10000; void Dijkstra(int n, int v, int *dist, int *prev, int matrix[maxnum][maxnum]) { bool visited[maxnum]; int i, j; for(i = 1; i <= n; i++) { dist[i] = matrix[v][i]; visited[i] = 0; if(dist[i] == maxint) prev[i] = 0; else prev[i] = v; } dist[v] = 0; visited[v] = 1; // 依次将未放入S集合的结点中,取dist[]最小值的结点,放入结合S中 // 一旦S包含了所有V中顶点,dist就记录了从源点到所有其他顶点之间的最短路径长度 for(i = 2; i <= n; i ++) { int temp = maxint; int u; for(j = 1; j <= n; j++) { if((visited[j]==0)&&(dist[j]<temp)) { u = j; temp = dist[j]; } } visited[u] = 1; for(j = 1; j <= n; j++) { if((visited[j]==0)&&(matrix[u][j]<maxint)) { int newdist = dist[u]+matrix[u][j]; if(newdist<dist[j]) { dist[j] = newdist; prev[j] = u; } } } } } void searchPath(int *prev, int u, int v) { stack<int>s; while(v!=u) { s.push(v); v = prev[v]; } s.push(v); while(!s.empty()) { cout << s.top()-1 << endl; s.pop(); } } int main() { //freopen("test.txt", "r", stdin); int dist[maxnum]; int prev[maxnum]; int matrix[maxnum][maxnum]; int n; cin >> n; int i, j; for(i = 1; i <= n; i++) { for(j = 1; j <= n; j ++) { cin >> matrix[i][j]; } } int x, y; cin >> x >> y; Dijkstra(n, x+1, dist, prev, matrix); // for(i = 1; i <= n; i++) // printf("%d%c", dist[i], i == n?'\n':' '); searchPath(prev, x+1, y+1); }
相关文章推荐
- 一种文库类网站建设思路.md
- Spring_Q_collect
- svn的merge使用例子
- 【JAVA开发之IO流1-3】IO流之缓冲流
- N
- 猜数字游戏
- 求赋权图中一个结点到所有结点的最短路径的长度
- HTML5与CSS3基础(二)
- 《写给亲爱的你》
- 自动生成格雷码
- 动画原理与实现 浅析
- Java内存分配
- 我的ef连接mysql之旅
- [android] activity的启动模式
- x86汇编--(一)寄存器功能、寻址方式、伪指令总结
- 输出以二叉树表示的算术表达式
- 网络基本概念之TCP, UDP, 单播(Unicast), 多播(组播)(Multicast)
- http-equiv="X-UA-Compatible" 设置IE浏览器兼容模式
- RealThinClient学习(一)
- HTML5与CSS3基础(一)