有向图(2)--深度优先搜索&&广度优先搜索
来源:互联网 发布:淘宝 省钱快报 编辑:程序博客网 时间:2024/05/21 21:47
-DepthFirstDirectedPaths 深度优先搜索
解决单点有向路径。给定一幅有向图和一个起点s,回答“从s到给定目的顶点v是否存在一条有向路径?如果有,请找出这条路径”等类似问题。
#ifndef __DEPTH_FIRST_PATHS_H__#define __DEPTH_FIRST_PATHS_H__#include "Digraph.h"#include <stack>class DepthFirstDirectedPaths {private:bool* marked;// 是否标记过int* edgeTo;// 指向索引的点int start;// 起点public:DepthFirstDirectedPaths(const Digraph& G, int s);~DepthFirstDirectedPaths() { delete[] marked; delete[] edgeTo; }bool hasPathTo(int v)const { return marked[v]; }std::stack<int> pathTo(int v)const;private:void dfs(const Digraph& G, int v);};// constructorDepthFirstDirectedPaths::DepthFirstDirectedPaths(const Digraph& G, int s) {start = s;marked = new bool[G.getV()];edgeTo = new int[G.getV()];for (int i = 0; i < G.getV(); ++i) {marked[i] = false;edgeTo[i] = i;}dfs(G, s);}void DepthFirstDirectedPaths::dfs(const Digraph& G, int v) {marked[v] = true;for (int w : G.getAdj(v)) {if (!marked[w]) {edgeTo[w] = v;dfs(G, w);}}}// return the path in a stackstd::stack<int> DepthFirstDirectedPaths::pathTo(int v)const {std::stack<int> stk;while (v != start) {stk.push(v);v = edgeTo[v];}stk.push(start);return stk;}#endif
结合上一篇博客的Digraph.h
测试-main,cpp
#include "Digraph.h"#include "DirectedDFS.h"#include "DepthFirstDirectedPaths.h"#include <iostream>using namespace std;int main(){int vNum, eNum;cin >> vNum >> eNum;Digraph G(vNum);int v, w;for (int i = 0; i < eNum; ++i) {cin >> v >> w;G.addEdge(v, w);}DepthFirstDirectedPaths dfp(G, 0);for (int i = 0; i < vNum; ++i) {cout << 0 << " to " << i << ": ";if (dfp.hasPathTo(i)) {stack<int> stk = dfp.pathTo(i);while (!stk.empty()) {cout << stk.top() << " ";stk.pop();}}cout << endl;}return 0;}
-BreadthFirstDirectedPaths.h 广度优先搜索
单点最短有向路径。给定一幅有向图和一个起点s,回答“从s到给定目的顶点v是否存在一条有向路径?”如果有,找出其中最短的那条(所含边数最少)。等类似问题
#ifndef __BREADTH_FIRST_DIRECTED_PATHS_H__#define __BREADTH_FIRST_DIRECTED_PATHS_H__#include "Digraph.h"#include <stack>#include <queue>class BreadthFirstDirectedPaths {private:bool* marked;int* edgeTo;int start;public:BreadthFirstDirectedPaths(const Digraph& G, int s);~BreadthFirstDirectedPaths() { delete[] marked; delete[] edgeTo; }bool hasPathTo(int v)const { return marked[v]; }std::stack<int> pathTo(int v)const;private:void bfs(const Digraph& G, int v);};// constructorBreadthFirstDirectedPaths::BreadthFirstDirectedPaths(const Digraph& G, int s) {start = s;marked = new bool[G.getV()];edgeTo = new int[G.getV()];for (int i = 0; i < G.getV(); ++i) {marked[i] = false;edgeTo[i] = i;}bfs(G, s);}void BreadthFirstDirectedPaths::bfs(const Digraph& G, int v) {marked[start] = true;// 初始化标记起点std::queue<int> q;q.push(start);int tmp;while (!q.empty()) {tmp = q.front();marked[tmp] = true;q.pop();for (int w : G.getAdj(tmp)) {if (!marked[w]) {edgeTo[w] = tmp;q.push(w);}}}}// pathTostd::stack<int> BreadthFirstDirectedPaths::pathTo(int v)const {std::stack<int> stk;while (v != start) {stk.push(v);v = edgeTo[v];}stk.push(start);return stk;}#endif
测试-main.cpp
int main(){int vNum, eNum;cin >> vNum >> eNum;Digraph G(vNum);int v, w;for (int i = 0; i < eNum; ++i) {cin >> v >> w;G.addEdge(v, w);}BreadthFirstDirectedPaths bfp(G, 0);for (int i = 0; i < vNum; ++i) {cout << 0 << " to " << i << ": ";if (bfp.hasPathTo(i)) {stack<int> stk = bfp.pathTo(i);while (!stk.empty()) {cout << stk.top() << " ";stk.pop();}}cout << endl;}return 0;}
这是示例的有向图
0 0
- 有向图(2)--深度优先搜索&&广度优先搜索
- 有向图的深度优先搜索和广度优先搜索
- 图 广度优先与深度优先搜索
- 广度 / 深度优先搜索
- 搜索图:即深度优先搜索和广度优先搜索
- 图简介3-有向图的实现+深度/广度优先搜索
- 深度优先搜索和广度优先搜索
- 深度优先搜索与广度优先搜索
- 深度优先搜索 广度优先搜索
- 深度优先搜索与广度优先搜索
- 深度优先搜索和广度优先搜索
- 深度优先搜索 广度优先搜索
- 广度优先搜索与深度优先搜索
- 深度优先搜索与广度优先搜索
- 深度优先搜索 广度优先搜索
- 深度优先搜索和广度优先搜索
- 广度优先搜索与深度优先搜索
- 深度优先搜索与广度优先搜索
- Optional变量的?和!的区别
- iOS新闻客户端开发教程-完整教程目录
- Ehcache整合spring配置
- LeetCode 278 : First Bad Version (Java)
- Linux命令-权限设置
- 有向图(2)--深度优先搜索&&广度优先搜索
- SpringMVC深度探险(一) —— SpringMVC前传
- Mangos Zero 编译安装
- reg修改网页收藏夹存储位置
- CSU 1547 背包
- 初识C语言
- 用scheme语言实现SPFA算法(单源最短路)
- ubuntu12.04中shell脚本无法使用source的原因及解决方法
- head标签