有向图(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
原创粉丝点击