标签:
基于C++ STL图的邻接表表示及深度、广度搜索实现,对图论的学习有帮助,代码如下:
#include <iostream> #include <vector> #include <set> using namespace std; #define MAX(a, b) ((a) > (b) ? (a) : (b) ) //定义图的定点 typedef struct Vertex { int id; vector<int> connectors; //存储节点的后续连接顶点编号 Vertex() : id(-1) {} Vertex(int nid) : id(nid) {} } Vertex; //定义Graph的邻接表表示 typedef struct Graph { vector<Vertex> vertexs; //存储定点信息 int nVertexs; //计数:邻接数 bool isDAG; //标志:是有向图吗 Graph(int n, bool isDAG) : nVertexs(n), isDAG(isDAG) { vertexs.resize(n); } //向图中添加边 bool addEdge(int id1, int id2) { if (!(MAX(id1, id2) < vertexs.size())) return false; if (isDAG) { vertexs[id1].connectors.push_back(id2); } else { vertexs[id1].connectors.push_back(id2); vertexs[id2].connectors.push_back(id1); } return true; } //广度优先搜索 vector<int> BFS(int start) { set<int> visited; vector<int> g, rst; g.push_back(start); visited.insert(start); while(g.size() > 0) { int id = g[0]; g.erase(g.begin()); rst.push_back(id); for(int i = 0; i < vertexs[id].connectors.size(); i++) { int id1 = vertexs[id].connectors[i]; if (visited.count(id1) == 0) { g.push_back(id1); visited.insert(id1); } } } return rst; } //深度优先搜索 vector<int> DFS(int start) { set<int> visited; vector<int> g, rst; g.push_back(start); //cout << "push " << start << " "; visited.insert(start); rst.push_back(start); bool found; while(g.size() > 0) { int id = g[g.size()-1]; found = false; for(int i = 0; i < vertexs[id].connectors.size(); i++) { int id1 = vertexs[id].connectors[i]; if (visited.count(id1) == 0) { g.push_back(id1); rst.push_back(id1); visited.insert(id1); //cout << "push " << id1 << " "; found = true; break; } } if (!found) { int id2 = g[g.size()-1]; rst.push_back(-1 * id2); //cout << "pop " << id2 << " "; g.pop_back(); } } //cout << endl; return rst; } } Graph; int main() { Graph g(8, false); g.addEdge(0, 1); g.addEdge(0, 3); g.addEdge(1, 2); g.addEdge(3, 4); g.addEdge(3, 5); g.addEdge(4, 5); g.addEdge(4, 6); g.addEdge(5, 6); g.addEdge(5, 7); g.addEdge(6, 7); vector<int> bv = g.BFS(0); cout << "宽度优先搜索节点顺序:"; for(int j = 0; j < bv.size(); j++) cout << bv[j] << " "; cout << endl; cout << "深度优先搜索节点顺序:"; Graph g1(6, false); g1.addEdge(0, 1); g1.addEdge(0, 4); g1.addEdge(0, 5); g1.addEdge(1, 5); g1.addEdge(4, 5); g1.addEdge(5, 2); g1.addEdge(5, 3); g1.addEdge(2, 3); vector<int> route = g1.DFS(0); for(int i = 0; i < route.size(); i++) cout << route[i] << " "; cout << endl; char ch; cin >> ch; return 0; }
标签:
原文地址:http://blog.csdn.net/miscclp/article/details/45097775