图的实现
来源:互联网 发布:北京纸箱厂 淘宝定做 编辑:程序博客网 时间: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
- 图算法的实现
- 图的邻接矩阵实现
- 饼图的实现
- 鹰眼图的实现
- 图的邻接矩阵实现
- 【数据结构】图的实现
- 图的邻接矩阵实现
- 图的底层实现
- 【java】图的实现
- 图的基本实现
- C++ 图的实现
- 图的实现
- 图的实现
- java 图的实现
- 图的DFS实现
- 图的邻接矩阵实现
- 图的邻接矩阵实现
- 焦点图的实现
- 中国崛起让西方乱了阵脚
- 从实例理解Struts2
- 日经社説 20150331 人口減見据えた国土計画に
- [IOS 开发] 9个超有用小技巧
- windows程序设计 架构概述
- 图的实现
- 京东大数据平台产品体系揭秘
- 一张图弄明白开源协议-GPL、BSD、MIT、Mozilla、Apache和LGPL 之间的区别
- 手机开门——门禁系统进入“互联网+”时代
- ubuntu 关闭apahce的php错误提示,服务器使用
- Deep Learning(深度学习)学习笔记整理系列之LeNet-5卷积参数个人理解
- 日经社説 20150331 普天間移設を法廷で争うのは筋違いだ
- tomcat(错误二) tomcat端口被占用了的解决办法
- JS中的prototype