图的邻接链表实现下的搜索两点之间所有路径的算法
2017-12-08 10:59
519 查看
算法用C++实现
为什么要写这个算法呢?苦于在网上查找只有邻接矩阵的实现,所以自己弄了一个邻接链表的实现,可以提高速率
实现方式是使用三个栈 其中一个栈用来遍历所有顶点,第二个栈用于记录第一个栈的父母结点,第三个栈用来记录正在遍历的其中一条路径
需要三个路径的原因是:每次将一个结点加入进第三个栈时,需要确定第三个栈顶元素是加入元素的父母结点
还需要一个数组用来记录结点是否被访问过
图的构建就不写上来了
测试数据如图
为什么要写这个算法呢?苦于在网上查找只有邻接矩阵的实现,所以自己弄了一个邻接链表的实现,可以提高速率
实现方式是使用三个栈 其中一个栈用来遍历所有顶点,第二个栈用于记录第一个栈的父母结点,第三个栈用来记录正在遍历的其中一条路径
需要三个路径的原因是:每次将一个结点加入进第三个栈时,需要确定第三个栈顶元素是加入元素的父母结点
还需要一个数组用来记录结点是否被访问过
template <class T> bool Picture<T>::findway() { cout<<"Input:"; T first,second; cin>>first>>second; cout<<"Output:"<<endl; int n0,n1; n0=getVerticePos(first); n1=getVerticePos(second); if(n0==-1||n1==-1) //不存在的结点 return false; bool *judge=new bool[numVertices]; //判断结点是否走过 for(int i=0;i<numVertices;i++) judge[i]=false; Edge *loc; stack <int> s; //遍历各结点 stack <int> parent; //记录前一结点 stack <int> q; //记录其中一条 s.push(n0); parent.push(-1); int i,j,length; int path[50]; while(!s.empty()) { i=s.top(); s.pop(); j=parent.top(); parent.pop(); judge[i]=true; if(q.empty()) q.push(i); else { while(q.top()!=j) { judge[q.top()]=false; q.pop(); } q.push(i); } if(i==n1) //找到终点 { length=0; while(!q.empty()) { path[length++]=q.top(); q.pop(); } for(int i=length;i>0;i--) { cout<<NodeTable[path[i-1]].data; q.push(path[i-1]); } cout<<endl; continue; //不再将邻接结点加入栈s } loc=NodeTable[i].adj; while(loc!=NULL) { if(judge[loc->dest]==false) //结点此路径没有被访问过 { s.push(loc->dest); parent.push(i); } loc=loc->link; } } return true; }
template <class T> int Picture<T>::getVerticePos(const T vertex) { for(int i=0;i<numVertices;i++) if(NodeTable[i].data==vertex) return i; //找到返回下标 cout<<vertex<<endl; return -1; //未找到返回-1 }
图的构建就不写上来了
测试数据如图
相关文章推荐
- 图的邻接链表实现下的搜索两点之间所有路径的算法
- 设计并实现求两点间所有路径的算法
- 九度 OJ 1447 题 最短路径问题 Dijkstra(迪杰斯特拉)算法实现,使用vector模板模拟邻接链表
- 图两点间的最短路径,所有路径算法C语言实现
- 搜索无向图中两点之间的所有路径(java)
- 搜索无向图中两点之间的所有路径(java)
- 求两点之间所有路径的算法
- 图两点间的最短路径,所有路径算法C语言实现
- 基于邻接链表的图的广度优先搜索Java实现
- 两点之间所有的最短路的算法(Multi-Dijkstra-shortest paths)
- 求两点间所有路径的遍历算法
- 遍历寻找给定两点之间的所有路径
- 使用广度遍历算法寻找两点之间的最短路径
- Dijkstra单源最短路径实现 及 Floyd任意两点之间的最短路径
- Matalab代码 实现 Dijkstra求 有向图及无向图之间,任意两点之间的最短路径
- 用Python实现Dijkstra算法用来寻找两点之间的最短路径 (Implementation of Dijkstra in Python)
- 无向连通图中两点间所有路径的算法
- 有向无环图两点之间的路径数目(算法导论22.4-2)
- 算法导论第二十五章-所有结点对的最短路径问题-Cpp代码实现
- Golang实现A星路径搜索算法