-Digraph.h 有向图的类
#ifndef __DIGRAPH_H__
#define __DIGRAPH_H__
#include <list>
#include <string>
class Digraph {
private:
int vNum; // 顶点数
int eNum; // 边数
std::list<int>* adj;
public:
Digraph(int vnum);
~Digraph() { delete[] adj; }
Digraph(const Digraph& G);
int getV()const { return vNum; }
int getE()const { return eNum; }
std::list<int> getAdj(int v)const {
return adj[v];
}
Digraph reverse()const;
std::string toString()const;
void addEdge(int v, int w);
};
// constructor
Digraph::Digraph(int vnum) {
vNum = vnum;
eNum = 0;
adj = new std::list<int>[vNum];
}
// copy constructor
Digraph::Digraph(const Digraph& G) {
vNum = G.vNum;
eNum = G.eNum;
adj = new std::list<int>[vNum];
for (int i = 0; i < vNum; ++i)
adj[i] = G.adj[i];
}
// addEdge
void Digraph::addEdge(int v, int w) {
adj[v].push_front(w);
++eNum;
}
// reverse
Digraph Digraph::reverse()const {
Digraph R(vNum);
for (int v = 0; v < vNum; ++v) {
for (int w : adj[v])
R.addEdge(w, v);
}
return R;
}
// toString
std::string Digraph::toString()const {
std::string s;
for (int v = 0; v < vNum; ++v) {
s += std::to_string(v) + ": ";
for (int w : adj[v])
s += std::to_string(w) + " ";
s += "\n";
}
return s;
}
#endif
-DirectedDFS(DirectedDepthFirstSearch) 有向图深度优先搜索
判断图中点的可达性
#ifndef __DIRECTED_DFS_H__
#define __DIRECTED_DFS_H__
#include "Digraph.h"
// 解决单点可达性或者多点可达性
class DirectedDFS {
private:
bool* marked;
public:
DirectedDFS(const Digraph& G, int s);
DirectedDFS(const Digraph& G, std::list<int> ilst);
~DirectedDFS() { delete[] marked; }
bool isMarked(int v)const { return marked[v]; }
private:
void dfs(const Digraph& G, int v);
};
// constructor
DirectedDFS::DirectedDFS(const Digraph& G, int s) {
marked = new bool[G.getV()];
for (int i = 0; i < G.getV(); ++i)
marked[i] = false;
dfs(G, s);
}
// constructor
DirectedDFS::DirectedDFS(const Digraph& G, std::list<int> ilst) {
marked = new bool[G.getV()];
for (int i = 0; i < G.getV(); ++i)
marked[i] = false;
for (int v : ilst) {
if (!marked[v])
dfs(G, v);
}
}
void DirectedDFS::dfs(const Digraph& G, int v) {
marked[v] = true;
for (int w : G.getAdj(v)) {
if (!marked[w])
dfs(G, w);
}
}
#endif
-对上面两个类的测试 -main.cpp
#include "Digraph.h"
#include "DirectedDFS.h"
#include <iostream>
using namespace std;
int main()
{
int vNum, eNum;
cin >> vNum >> eNum;
Digraph dg(vNum);
int v, w;
for (int i = 0; i < eNum; ++i) {
cin >> v >> w;
dg.addEdge(v, w);
}
cout << "ddfs1:" << endl;
DirectedDFS ddfs1(dg, 1);
for (int i = 0; i < vNum; ++i) {
if (ddfs1.isMarked(i)) cout << i << " ";
}
cout << endl << "ddfs2:" << endl;
DirectedDFS ddfs2(dg, 2);
for (int i = 0; i < vNum; ++i) {
if (ddfs2.isMarked(i)) cout << i << " ";
}
cout << endl << "ddfs3:" << endl;
std::list<int> ilst;
ilst.push_back(1); ilst.push_back(2); ilst.push_back(6);
DirectedDFS ddfs3(dg, ilst);
for (int i = 0; i < vNum; ++i) {
if (ddfs3.isMarked(i)) cout << i << " ";
}
return 0;
}