|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 andalousie 于 2014-2-18 11:03 编辑
对于有向图,只需要在IsConnected里面只定义一个方向值等于一,另一个值不定义即可。graph.h
- #if !defined (GRAPH_H)
- #define GRAPH_H
- #include "stack.h"
- /************************************************************
- Class Graph represents a Graph [V,E] having vertices V and
- edges E.
- ************************************************************/
- class Graph {
- private:
- int _n; /// n is the number of vertices in the graph
- int ** _A; /// A stores the edges between two vertices
- bool * visited;
- IStack reverse;
- public:
- Graph(int size = 2);
- ~Graph();
- bool isConnected(int, int);
- void addEdge(int x, int y);
- void DFS(int);
- void Toposort();
- };
- #endif
复制代码 graph.cc
- #include <iostream>
- #include "graph.h"
- #include "stack.h"
- Graph::Graph(int size) {
- int i, j;
- if (size < 2) _n = 2;
- else _n = size;
- _A = new int*[_n];
- for (i = 0; i < _n; ++i)
- _A[i] = new int[_n];
- for (i = 0; i < _n; ++i)
- for (j = 0; j < _n; ++j)
- _A[i][j] = 0;
- }
- Graph::~Graph() {
- for (int i = 0; i < _n; ++i)
- delete [] _A[i];
- delete [] _A;
- delete [] visited;
- }
- /******************************************************
- Checks if two given vertices are connected by an edge
- @param u vertex
- @param v vertex
- @return true if connected false if not connected
- ******************************************************/
- bool Graph::isConnected(int x, int y) {
- return (_A[x-1][y-1] == 1);
- }
- /*****************************************************
- adds an edge E to the graph G.
- @param u vertex
- @param v vertex
- *****************************************************/
- void Graph::addEdge(int x, int y) {
- _A[x-1][y-1] = 1;
- }
- /*****************************************************
- performs Depth First Search
- @param x initial vertex
- *****************************************************/
- void Graph::DFS(int v)
- {
- visited[v] = true;
- for(int w = 1; w <= _n; ++w)
- {
- if(isConnected(v, w) && !visited[w]) DFS(w);
- }
- reverse.push(v);
- }
- void Graph::Toposort(){
- visited = new bool[_n+1];
- for (int i = 1; i <= _n; ++i)
- visited[i] = false;
- for (int v = 1; v <= _n; ++v)
- {
- if(!visited[v]) DFS(v);
- }
- while(!reverse.isEmpty())
- std::cout << reverse.pop() << " ";
- }
复制代码 stack.h, stack.cc参照我另一篇文章里面的代码。
Graph_search.cpp
- #include <iostream>
- #include "graph.h"
- using namespace std;
- int main(){
- /** Creates a graph with 12 vertices */
- Graph g1(7);
- /** Adds edges to the graph */
- g1.addEdge(1, 6); g1.addEdge(1, 3);
- g1.addEdge(1, 2); g1.addEdge(4, 7);
- g1.addEdge(4, 6); g1.addEdge(4 ,5);
- g1.addEdge(6, 5); g1.addEdge(7, 5);
- g1.addEdge(7, 1); g1.addEdge(4, 3);
- g1.addEdge(2, 5);
- /** Explores all vertices findable from vertex 1 */
- g1.Toposort();
- }
复制代码
|
|