直接入题,参加2017年华为竞赛的时候,需要输出路径,当时设了源点和汇点,是单源单汇的寻路径,那么问题就归为寻找给定两点之间的所有路径问题


我们的老师一直教我们这些菜鸟们说,写程序一定要先在纸上写好考虑清楚,这次我觉得这个应该挺简单的,就没写,没想到出现了错误,难调,搞了好久,死循环。然后自己乖乖的关掉vs,乖乖写思路。
首先,确认目的,也就是输入,也就是我们题目的问题:寻找给定两点之间的所有路径,上个例子吧,好说也好顺思路:

假如我们需要找0->11之间所有路径,那么我们希望得到的输出结果应该就是:
路径1:0–>1–>2–>5–>7–>11
路径2: 0–>1–>2–>5–>8–>11
路径3: 0–>1–>2–>6–>9–>11
路径4:0–>1–>2–>6–>10–>11
路径5:0–>1–>3–>11
路径6: 0–>1–>4–>11
到此,程序输入输出确定:

  • 输入:带有节点和边的信息的邻接矩阵
  • 输出:就是上面的提到的路径

建立上图的邻接矩阵A,节点i->j之间有边,则A(i,j)==1
上图的邻接矩阵就是:

接下来就是怎么输出来路径,DFS,BFS都行,先想想如果自己去找路径,怎么搜?也好想,从源点“0”出发,由于编号是按顺序的,而且终点是编号最大的那个点,我就偷个懒,特殊情况特殊对待吧,还是画图最直观。
还是来看邻接矩阵:

首先将起点 0 入栈,设置入栈状态为1,从例图可以看出,与0相连的,最先开始搜到 1 ,即第0行第1列红色框,将节点1入栈,入栈状态设置为1,继续,从第1行开始搜,搜到第一个非零点,即第1行第2列的红色框,将节点2入栈,如此往复,知道找到终点 11 ,就得到了路径:0–>1–>2–>5–>7–>11。

接下来要搜索下一条路径,将节点 11 出栈,入栈状态设置为 0 ,在考虑是否要将节点7出栈,我们从例图可以看到,第7行我们一行都已经搜索完毕了,都搜索到终点 11 了,那么节点7就必须出栈,因为如果不出栈,从节点 7 搜索就会再一次搜索到节点 11,那么就陷入死循环了,所以必须将 7 出栈,而且应该从节点 7 之后的搜索,因为节点 7 之前要么是已经搜索过得,要么就是第一个搜索到的,所以需要记录终点之前的节点位置,那么接下来,可以看到节点 8 非零,那么从第 8 行开始搜索,检查搜到的节点的入栈状态,又搜索到终点 11 ,那么就搜到路径:0–>1–>2–>5–>8–>11,以便从其之后继续搜索路径,依次输出各个路径,直至栈内为空为止。
那么需要的变量应该是:邻接矩阵,入栈状态变量,存储path组的结构,以及存储单个path的vector, 存储寻找路径的栈,以及一个记录位置变量。

代码如下:

#include<iostream>
#include<vector>
#include<stack>
#define MAX_EDGE_NUM  500
#define MAX_LINE_LEN 200
using namespace std;
//读取文件的函数
int read_file(char ** const buff, const unsigned int spec, const char * const filename)
{FILE *fp = fopen(filename, "r");if (fp == NULL){printf("Fail to open file %s, %s.\n", filename, strerror(errno));return 0;}printf("Open file %s OK.\n", filename);char line[MAX_LINE_LEN + 2];unsigned int cnt = 0;while ((cnt < spec) && !feof(fp)){line[0] = 0;if (fgets(line, MAX_LINE_LEN + 2, fp) == NULL)  continue;if (line[0] == 0)   continue;buff[cnt] = (char *)malloc(MAX_LINE_LEN + 2);strncpy(buff[cnt], line, MAX_LINE_LEN + 2 - 1);buff[cnt][MAX_LINE_LEN + 1] = 0;cnt++;}fclose(fp);printf("There are %d lines in file %s.\n", cnt, filename);return cnt;
}
//将每行的数据转换为int的函数
void  char2int(char* char_data, int *int_data, int int_length)
{char c[10];int num = 0;int count = 0;for (int i = 0; i < 10;){count = 0;while (char_data[i] != ' ' && char_data[i] != '\n' && char_data[i] != '\r' && count <10){c[count] = char_data[i];i++;count++;}int_data[num] = atoi(c);memset(c, 0, 10);++num;if (num >= int_length){return;}i++;}
}
int main(int argc, char *argv[])
{char *topo[MAX_EDGE_NUM];int line_num;//读取文件,需要在属性--配置属性--调试--命令参数,以及工作目录设置所读取的文件node.txtchar *topo_file = argv[1];line_num = read_file(topo, MAX_EDGE_NUM, topo_file);printf("line num is :%d \n", line_num);if (line_num == 0){printf("Please input valid topo file.\n");return -1;}//邻接矩阵int node_num = 11;short **adjcent_Matrix = new short*[node_num + 1]();//初始化邻接矩阵全为0for (int i = 0; i < node_num; i++){adjcent_Matrix[i] = new short[node_num + 1]();}//按照例图填充邻接矩阵int start_node,end_node;int data2[2];for (int i = 0; i < line_num; i++){char2int(topo[i], data2, 2);start_node = data2[0];end_node = data2[1];adjcent_Matrix[start_node][end_node] = 1;}bool* is_in_stack = new bool[node_num+1]();//入栈状态变量stack<int>node_stack;int c_position = 0;vector<vector<int>>paths;//存储所有路径vector<int>path;//存储单条路径//起点入栈node_stack.push(0);is_in_stack[0] = 1;//设置起点已入栈,1表示在栈中,0 表示不在int top_element;//记录栈顶元素int tmp;while (!node_stack.empty()){top_element = node_stack.top();//查看栈顶元素,判断是否已经到达终点if (top_element == node_num)//若到达终点,输出路径,弹出栈中两个点,设置出栈状态{while (!node_stack.empty()){tmp = node_stack.top();node_stack.pop();path.push_back(tmp);}paths.push_back(path);//将路径加入路径组for (vector<int>::reverse_iterator rit = path.rbegin(); rit != path.rend(); rit++){node_stack.push(*rit);}path.clear();//清除单条路径node_stack.pop();is_in_stack[top_element] = 0;c_position = node_stack.top();//记录位置,以便从该位置之后进行搜索top_element = node_stack.top();node_stack.pop();is_in_stack[top_element] = 0; //cout << vis[top_element];}else{int i = 0;for (i = c_position + 1; i <node_num + 2; i++){if (is_in_stack[i] == 0 && adjcent_Matrix[top_element][i] != 0)//未入栈,而且节点之间有边相连{is_in_stack[i] = 1;//stack Innode_stack.push(i);//入栈c_position = 0;//位置置零,是因为从记录的位置开始搜索完以后,在新的行上搜索,自然从零开始,以免漏掉节点break;}}if (i == node_num + 2){top_element = node_stack.top();is_in_stack[top_element] = 0;c_position = node_stack.top();node_stack.pop();}}}//========================  输出 ==========================//逆向for (int i = 0; i <paths.size(); i++){cout << "路径" << i << ": ";for (int j = paths[i].size()-1; j >=0; j--){if (j == 0){cout << paths[i][j];}else{cout << paths[i][j] << "->";}}cout << endl;}//========================  输出 ==========================//删除内存for (int i = 0; i < node_num ; i++){delete[] adjcent_Matrix[i];}delete[] adjcent_Matrix;
}

他强任他强!

遍历寻找给定两点之间的所有路径相关推荐

  1. matlab两点之间的所有路径,引用 在图中搜索两点间的所有路径matlab编程

    引用 在图中搜索两点间的所有路径matlab编程 2018-09-18 function possiablePaths = findPath(Graph, partialPath, destinati ...

  2. 数据结构 || 图深度优先搜索遍历以及求两点间的简单路径

    本文图的存储结构是基于无向图的邻接多重表实现的 图的深度优先搜索的递归遍历 void DFS(AMLGraph G, int i) {cout << G.adjmulist[i].data ...

  3. 两点之间的连线java_java计算图两点之间的路径实例代码

    java计算图两点之间的路径总结 本文实例为大家分享了java计算图两点之间的所有路径的具体代码,供大家参考,具体内容如下 1.给定图如下: 2.求0到3之间可达的所有路径 这里问题就是关于搜索遍历的 ...

  4. 数学之美:两点之间最快的路径是什么?能看到最后的都是学霸

    今天我们一起来观赏一下数学之骚美. 这事儿和17世纪的一道谜题有关,直到后来微积分被建立起来以后才得正解.虽然问题不难,但结果惊艳. 我先来问一个比较「二」的问题: 两点之间最短的路径是什么? 喏,别 ...

  5. 数学之美:两点之间最快的路径

    掉节操的星期一又来了,所以呢一起来观赏一下数学之骚美. 这事儿和17世纪的一道谜题有关,直到后来微积分被建立起来以后才得正解.虽然问题不难,但结果惊艳. 我先来问一个比较「二」的问题: 两点之间最短的 ...

  6. 使用Floyd-Warshall算法求出两点之间的最短路径

    求出下面任意两个点之间的最短路径: 如何才能求出两点之间的最短路径呢?大家都知道学几何的时候,有一条定理就是:两点之间线段最短.但是在实际情况中,我往往两点之间没有之间的通路而是一些曲折的线路. 上面 ...

  7. [转]最速下降曲线:重力场中两点之间曲线更快

    数学之美:两点之间最快的路径 掉节操的星期一又来了,所以呢一起来观赏一下数学之骚美. 这事儿和17世纪的一道谜题有关,直到后来微积分被建立起来以后才得正解.虽然问题不难,但结果惊艳. 我先来问一个比较 ...

  8. 通过gps给定的两个经纬度坐标,计算两点之间的距离

    /** * * 计算两地之间的距离(给定经纬度) * * @param lat1 出发地经度 * @param lng1 出发地纬度 * @param lat2 目的地经度 * @param lng2 ...

  9. C++ 遍历寻找指定进程,通过进程ID获取窗口句柄,以及HWND与CWnd之间转换

    问题: 如题,如何遍历寻找指定进程?如何通过进程ID获取窗口句柄?HWND与CWnd之间是如何转换的? 解决: 1.HWND与CWnd之间的转换:使用 GetSafeHwnd 和 CWnd::From ...

最新文章

  1. 计算机软件属于输入还是输出,计算机基本输入输出系统是什么意思(基本输入输出系统简介)...
  2. IOS开发笔记16-Object-C中的属性
  3. 把ros2录制的bag包转换为ros1格式的bag包
  4. java 好处_Java的优点
  5. RabbitMQ的Work能者多劳模式
  6. 数学奥赛用不用计算机,报考自招必看!五大学科竞赛利弊详解,到底哪科最适合你?...
  7. 全选反选JavaScript实现
  8. leetcode 664. 奇怪的打印机(dp)
  9. 最短网络(信息学奥赛一本通-T1350)
  10. optimized mysql_MySQL解释计划中“Select tables optimized away”的含义
  11. 怎样完善和推广自己的理论模型?
  12. 解决Maven:Cannot resolve com.oracle.ojdbc:ojdbc6:11.2.0.1.0报红找不到问题,解决方案亲测有效详细图文教程 问题描述(ojdbc6)
  13. 【伸手党福利】开发人员重装系统顺序
  14. bch编码c语言有库么,BCH码的译码方法与流程
  15. Arduino驱动MAX30102心率血氧传感器模块
  16. 在Octane中提升渲染速度的技巧(第2部分)
  17. np.array数组的切片
  18. centos7 telnet访问mysql出错Connection closed by foreign host
  19. 李宏毅老师《机器学习》课程笔记-2.2 为什么是“深度”学习?
  20. Invalid default value for

热门文章

  1. 计算机选做实验原理,实验一计算机组成原理
  2. 2021国美革新路:“真快乐”凭什么来搅动零售领域?
  3. Eclipse 的 Debug 介绍与技巧
  4. Linux就该这么学--Samba NFS的配置
  5. java计算机毕业设计无极服装出租管理系统源代码+数据库+系统+lw文档
  6. 仲恺农业工程学院计算机专业怎么样,仲恺农业工程学院好就业吗?附学校就业率最高的专业名单...
  7. 灯ps后期素材素材推荐 精品 小众
  8. go-go test 单元测试
  9. 毕然:莫让羞辱成为一种社会惯例
  10. 一物一码追踪溯源系统介绍