Dijkstra求最短路径
来源:互联网 发布:自学游戏编程先学什么 编辑:程序博客网 时间:2024/06/07 06:43
把m1.txt与可执行文件放在统一路径下
m1.txt(距离矩阵,9行9列)的数据如下:
9999 6 3 1 9999 9999 9999 9999 9999 9999 9999 9999 9999 1 9999 9999 9999 9999 9999 2 9999 2 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 10 9999 9999 9999 9999 9999 9999 6 9999 4 3 6 9999 9999 9999 9999 9999 10 9999 2 9999 9999 9999 9999 9999 9999 9999 9999 9999 4 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 2 9999 9999 3 9999
程序如下:
#include <iostream>#include <fstream>using namespace std;#define MAX_NODE 100#define MAX_INT 9999int n1, n2; // 分别表示矩阵的行和列int main(int argc, char* argv[]){ int** readTxtToArrayWithoutKnowRowOrColumn(const char* strPath); void printArray(int **a, int m, int n); int** m = 0; int p[MAX_NODE] = {0}; // 记录当前路径长度 int pt[MAX_NODE] = {0}; // 记录当前路径是否是最短路径,1表示是 for(int i = 1; i < MAX_NODE; i++){ p[i] = MAX_INT; } cout << "read data" << endl; m = readTxtToArrayWithoutKnowRowOrColumn("m1.txt"); cout << "行数: " << n1 << ", 列数: " << n2 << endl; printArray(m, n1, n2); cout << "用Dijkstra算法求最短路径:" << endl; p[0] = 0; // v1到v1的路径为0 pt[0] = 1; // 当前v1到v1的路径是最短路径 for(int i = 0; i < n1 - 1; i++){ // 求n个节点中1个节点到另一个节点的最短路径最多需要n-1步 for(int j = 1; j < n1; j++){ if(pt[j] != 1){ // 还没有求出第1个节点到第j个节点的最短路径 for(int k = 0; k < n1; k++){ // 计算第1个节点到第j个节点的路径 if(pt[k] == 1){ // k是已经求出最短路径的节点 if(m[k][j] < MAX_INT){ // 如果k到j有路径 if((p[k] + m[k][j]) < p[j]){ p[j] = p[k] + m[k][j]; } } } } } } int tmp = MAX_INT; for(int j = 1; j < n1; j++){ if(pt[j] != 1){ if(p[j] < tmp){ tmp = p[j]; } } } for(int j = 1; j < n1; j++){ if(pt[j] != 1){ if(p[j] == tmp){ pt[j] = 1; } } } } cout << "第1个节点到其他各个节点的最短路径如下:" << endl; for(int i = 0; i < n1; i++){ cout << p[i] << "\t"; } cout << endl; return 0;}int** readTxtToArrayWithoutKnowRowOrColumn(const char* strPath){ int** a = new int* [MAX_NODE]; for(int i = 0; i < MAX_NODE; i++){ a[i] = new int[MAX_NODE]; } int nTmp = 0; n1 = 0; n2 = 0; ifstream is(strPath); if(!is){ cout << "open file error!" << endl; }else{ char p; int num; int j = 0; while(is.get(p)){ // 判断是否到达文末 do{ if(p == '\n'){ n1++; // 统计行数 if(n2 == 0){ n2 = nTmp; // 实际上只统计了第一行的列数 } j = 0; // cout << endl; // 一行之后输出一个回车符 } }while(isspace((int)p) && is.get(p)); if(!is) break; nTmp++; // 统计列数 is.putback(p); // 如果前面读入的不是空格或者回车符,则把刚才读入的字符返回文件流 is >> num; // cout << num << "\t"; a[n1][j++] = num; } } is.close(); return a;}void printArray(int** a, int m, int n){ for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++){ cout << a[i][j] << "\t"; } cout << endl; }}
0 0
- Dijkstra求最短路径
- 求最短路径(dijkstra)
- dijkstra 求最短路径算法
- dijkstra 求最短路径
- Dijkstra算法求最短路径
- Dijkstra 算法求最短路径
- 解析dijkstra求最短路径
- Dijkstra算法求最短路径
- Dijkstra算法求最短路径
- Dijkstra 求最短路径算法
- Dijkstra求最短路径
- dijkstra求最短路径(水题)
- Dijkstra算法 ---求最短路径
- Dijkstra求最短路径
- dijkstra求最短路径长度
- Dijkstra算法求最短路径
- dijkstra算法求最短路径
- Dijkstra求最短路径
- 利用动态加载实现手机淘宝的节日特效
- Python3下载安装教程并安装numpy模块
- 小程序
- HTML标签marquee实现滚动效果
- HTML5--Geolocation(地理定位)
- Dijkstra求最短路径
- Java IO流使用详解
- NHK Easy News 翻译 12月19日
- AutoComplete
- 两个Activity之间传递List<T>数据
- servlet设置编码无效
- [Django]models中定义的choices 字典在页面中显示值
- java系统高并发解决方案
- TypeError: view must be a callable or a list/tuple in the case of include().解决办法