图的实现

来源:互联网 发布:北京纸箱厂 淘宝定做 编辑:程序博客网 时间:2024/04/28 16:04
#include <list>#include <stack>#include <string.h>#include <queue>using namespace std;#define GRAPH_SIZE_MAX 25typedef unsigned int uint32_t;template <typename T>class Graph{private:T vertex[GRAPH_SIZE_MAX];uint32_t edge[GRAPH_SIZE_MAX][GRAPH_SIZE_MAX];uint32_t size;void depth_first_search_r(list<T> &pathList, T &v);bool find_vertex(list<T> &ls, T &v){typename list<T>::iterator iter;for(iter = ls.begin(); iter != ls.end(); iter++){if(*iter == v){return true;}}return false;}stack<T> &get_neighbours(T &vertex){stack<T> s;int index = get_vertex_pos(vertex);if(index < 0){//can't find vetex in vertex set//return an empty stackreturn s;}for(int i=0; i<size; i++){if(edge[index][i] > 0){s.push(vertex[i]);}}return s;}int get_vertex_pos(T &vertex){int i;for(i=0; i<size; i++){if(vertex[i] == vertex){break;}}//vertex are not in this graphif(i == size){i = -1;}return i;}uint32_t get_weight(T &vertex1, T &vertex2){int pos1 = get_vertex_pos(vertex1);int pos2 = get_vertex_pos(vertex2);//errorif(pos1 == -1 || pos2 == -1){return -1;}return edge[pos1][pos2];}public:uint32_t num_of_vertice(){return size;}Graph():size(0){memset(edge, 0x00, sizeof(edge));}bool insert_vertex(T &v){if(size <= GRAPH_SIZE_MAX){vertex[size] = v;size++;return true;}else{return false;}}void insert_edge(T &v1, T &v2, int weight){int pos1 = get_vertex_pos(v1);int pos2 = get_vertex_pos(v2);//errorif(pos1 == -1 || pos2 == -1){return;}edge[pos1][pos2] = weight;}void delete_vertex(T &v){int pos = get_vertex_pos(v);if(pos < 0){//can't find vetex in vertex setreturn;}for(int row=0; row<size; row++){for(int col = pos; col<size; col++){edge[row][col] = edge[row][col+1];}}for(int col = 0; col<size; col++){for(int row=pos; row<size; row++){edge[row][col] = edge[row+1][col];}}}void delete_edge(T &v1, T &v2){int pos1 = get_vertex_pos(v1);int pos2 = get_vertex_pos(v2);//errorif(pos1 == -1 || pos2 == -1){return -1;}vertex[pos1][pos2] = 0;}list<T> &depth_first_search_r(T &v);list<T> &depth_first_search(T &v);list<T> &bread_first_search(T &v);bool pathConnected(Graph<T> *g, T v, T w){list<T> ls;ls = g->depth_first_search_r(v);for(list<T>::iterator iter = ls.begin(); iter != ls.end(); iter++){if(*iter == w){return true;}}return false;}};template <typename T>void Graph<T>::depth_first_search_r(list<T> &pathList, T &v){pathList.push_back(v);stack<T> s;s = get_neighbours(v);if(s.empty()){return;}else{while(!s.empty()){T vertex = s.pop();if(!find_vertex(pathList, vertex)){//pathList.push_back(vertex);depth_first_search_r(pathList, vertex);}}}}template <typename T>list<T> &Graph<T>::depth_first_search_r(T &beginVertex){list<T> &ls;depth_first_search_r(ls, beginVertex);return ls;}template <typename T>list<T> &Graph<T>::depth_first_search(T &beginVertex){list<T> lsPath;stack<T> s;s.push(beginVertex);while(!s.empty()){T v = s.pop();if(!find_vertex(lsPath, v)){lsPath.push_back(v);stack<T> ts = get_neighbours(v);while(!ts.empty()){T tv = ts.pop();if(!find_vertex(lsPath, tv)){s.push(tv);}}}}return lsPath;}template <typename T>list<T> &Graph<T>::bread_first_search(T &beginVertex){list<T> lsPath;queue<T> qVertex;qVertex.push(beginVertex);while(!qVertex.empty()){T vertex = qVertex.pop();if(!find_vertex(lsPath, vertex)){lsPath.push_back(vertex);stack<T> s;s = get_neighbours(vertex);while(!s.empty()){T v = s.pop();if(!find_vertex(lsPath, v)){qVertex.push(v);}}}}}

深度优先遍历DFS分别用递归和非递归的方式实现。

pathConnected用于计算两个节点v和w之间是否存在连接路径。

0 0
原创粉丝点击