您的位置:首页 > 其它

有向图

2015-12-05 21:50 274 查看
-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;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: