有向图
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) 有向图深度优先搜索
判断图中点的可达性
-对上面两个类的测试 -main.cpp
#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; }
相关文章推荐
- POJ 2083 Fractal (打表乱搞)
- Linux crontab 命令格式与详细例子
- URL Session(Cookie)
- static用法总结
- Android官方文档翻译 十 2.3Styling the Action Bar
- Java使用DOM解析XML
- VS常用快捷键
- Django 部署(Nginx)
- HDU 5591 ZYB's Game(取石子)
- git_sop 脚本使用说明
- 蓝懿 iOS 技术交流和心得分享 12.5
- UVALive 7276 Wooden Signs
- Android-多点触控的实现示例详解
- JavaScript中的self、this、call、apply、prototype、initialize
- git_sop 脚本使用说明
- [简单实用系列] listview下拉刷新,加载更多
- Storyboard要点与技巧
- MySQL 5.1同步到5.5卡库问题一则
- 简单PHP会话(session)说明
- window下的navigator对象