图的遍历(1)邻接矩阵的深度和广度优先遍历
来源:互联网 发布:国家对大数据发展规划 编辑:程序博客网 时间:2024/05/16 00:29
undirected_graph.h
/*----------------------------------------------- Created By EverSteins Email:EverSteins@gmail.com 转载请注明出处 ------------------------------------------------*/ #ifndef UNDIRECTED_GRAPH_H#define UNDIRECTED_GRAPH_H#include "utility.h"using std::string;class UndirectedGraph{public:UndirectedGraph():vetrex_count_(0),edge_count_(0),vetrices_(NULL),arcs_(NULL){}~UndirectedGraph();void Create();void DepthFirstTraversal() const; //深度优先遍历图void BreadthFirstTraverse() const; //广度优先遍历图private:void Dfs(int current,bool *visited) const;int Locate(const string& vetrex) const;string *vetrices_; bool *arcs_; //采用邻接矩阵存储表示,构造无向图int vetrex_count_;int edge_count_;#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ TypeName(const TypeName&); \ void operator=(const TypeName&)DISALLOW_COPY_AND_ASSIGN(UndirectedGraph);#undef DISALLOW_COPY_AND_ASSIGN};#endifundirected_graph.cc
/*----------------------------------------------- Created By EverSteins Email:EverSteins@gmail.com 转载请注明出处 ------------------------------------------------*/ #include "stdafx.h"#include <iostream>#include <queue>#include "undirected_graph.h"#include "utility.h"using namespace std;UndirectedGraph::~UndirectedGraph(){delete[] vetrices_;delete[] arcs_;}void UndirectedGraph::Create(){ cout<<"输入顶点数和边数:"<<endl; cin>>vetrex_count_>>edge_count_; if (vetrices_ != NULL) //如果是重建图{delete[] vetrices_;delete[] arcs_;vetrices_ = NULL;arcs_ = NULL;vetrex_count_ = 0;edge_count_ = 0;}vetrices_ = new string[vetrex_count_];arcs_ = new bool[vetrex_count_*vetrex_count_](); //创建并初始化邻接矩阵,默认初始化为false cout<<"输入顶点名称:"<<endl; for(int i=0;i<vetrex_count_;++i) cin>>vetrices_[i]; for(int i=0;i<edge_count_;++i) { cout<<"输入每条边对应的两个顶点:"<<endl; string v1,v2; cin>>v1>>v2;int i1,i2; i1=Locate(v1); i2=Locate(v2); while(i1 < 0 || i2 < 0 || i1 == i2) { cout<<"顶点名称输入错误,没有该顶点。请重新输入: "<<endl; cin>>v1>>v2; i1=Locate(v1); i2=Locate(v2); } arcs_[i1*vetrex_count_+i2] = true; arcs_[i2*vetrex_count_+i1] = arcs_[i1*vetrex_count_+i2]; //置对称边 } cout<<"图构造完成"<<endl; }//深度优先遍历图void UndirectedGraph::DepthFirstTraversal() const{assert(vetrices_ != NULL);bool *visited = new bool[vetrex_count_]();for (int i = 0;i < vetrex_count_;++i)if (!visited[i])Dfs(i,visited);delete[] visited;}//广度优先遍历图 void UndirectedGraph::BreadthFirstTraverse() const { bool *visited = new bool[vetrex_count_](); //默认为falsequeue<int> que; for(int i = 0;i < vetrex_count_;++i) {if (!visited[i]){visited[i] = true;cout<<vetrices_[i]<<' ';que.push(i);while (!que.empty()){int current = que.front();que.pop();for (int j = 0;j < vetrex_count_;++j){if (!visited[j] && arcs_[current*vetrex_count_ + j] == true){visited[j] = true;cout << vetrices_[j] << ' ';que.push(j);}}}}}delete[] visited;} void UndirectedGraph::Dfs(int current,bool *visited) const{visited[current] = true;cout<<vetrices_[current]<<' ';for (int i = 0;i < vetrex_count_;++i)if (arcs_[current*vetrex_count_ + i] == true && !visited[i])Dfs(i,visited);}int UndirectedGraph::Locate(const string& vetrex) const{for (int i=0;i<vetrex_count_;++i)if (vetrices_[i] == vetrex)return i;return -1;}main.cc
/*----------------------------------------------- Created By EverSteins Email:EverSteins@gmail.com 转载请注明出处 ------------------------------------------------*/ #include "stdafx.h"#include <iostream>#include <queue>#include "undirected_graph.h"#include "utility.h"using namespace std;UndirectedGraph::~UndirectedGraph(){delete[] vetrices_;delete[] arcs_;}void UndirectedGraph::Create(){ cout<<"输入顶点数和边数:"<<endl; cin>>vetrex_count_>>edge_count_; if (vetrices_ != NULL) //如果是重建图{delete[] vetrices_;delete[] arcs_;vetrices_ = NULL;arcs_ = NULL;vetrex_count_ = 0;edge_count_ = 0;}vetrices_ = new string[vetrex_count_];arcs_ = new bool[vetrex_count_*vetrex_count_](); //创建并初始化邻接矩阵,默认初始化为false cout<<"输入顶点名称:"<<endl; for(int i=0;i<vetrex_count_;++i) cin>>vetrices_[i]; for(int i=0;i<edge_count_;++i) { cout<<"输入每条边对应的两个顶点:"<<endl; string v1,v2; cin>>v1>>v2;int i1,i2; i1=Locate(v1); i2=Locate(v2); while(i1 < 0 || i2 < 0 || i1 == i2) { cout<<"顶点名称输入错误,没有该顶点。请重新输入: "<<endl; cin>>v1>>v2; i1=Locate(v1); i2=Locate(v2); } arcs_[i1*vetrex_count_+i2] = true; arcs_[i2*vetrex_count_+i1] = arcs_[i1*vetrex_count_+i2]; //置对称边 } cout<<"图构造完成"<<endl; }//深度优先遍历图void UndirectedGraph::DepthFirstTraversal() const{assert(vetrices_ != NULL);bool *visited = new bool[vetrex_count_]();for (int i = 0;i < vetrex_count_;++i)if (!visited[i])Dfs(i,visited);delete[] visited;}//广度优先遍历图 void UndirectedGraph::BreadthFirstTraverse() const { bool *visited = new bool[vetrex_count_](); //默认为falsequeue<int> que; for(int i = 0;i < vetrex_count_;++i) {if (!visited[i]){visited[i] = true;cout<<vetrices_[i]<<' ';que.push(i);while (!que.empty()){int current = que.front();que.pop();for (int j = 0;j < vetrex_count_;++j){if (!visited[j] && arcs_[current*vetrex_count_ + j] == true){visited[j] = true;cout << vetrices_[j] << ' ';que.push(j);}}}}}delete[] visited;} void UndirectedGraph::Dfs(int current,bool *visited) const{visited[current] = true;cout<<vetrices_[current]<<' ';for (int i = 0;i < vetrex_count_;++i)if (arcs_[current*vetrex_count_ + i] == true && !visited[i])Dfs(i,visited);}int UndirectedGraph::Locate(const string& vetrex) const{for (int i=0;i<vetrex_count_;++i)if (vetrices_[i] == vetrex)return i;return -1;}
- 图的遍历(1)邻接矩阵的深度和广度优先遍历
- 【图】图的邻接矩阵存储和广度、深度优先遍历
- 图(邻接矩阵)的深度、广度优先遍历
- C++实现图的邻接矩阵的创建以及其深度优先遍历和广度优先遍历
- 图的深度优先遍历和广度优先遍历--邻接矩阵法
- 图的邻接矩阵表示、广度优先遍历和深度优先遍历
- C语言实现图的邻接矩阵存储结构及深度优先遍历和广度优先遍历
- 邻接矩阵实现--图的深度优先遍历DFS和广度优先遍历BFS
- 图的深度和广度遍历(邻接矩阵)
- 图的广度优先遍历(邻接矩阵)
- 图:广度深度优先遍历(邻接矩阵)
- 图的邻接矩阵生成算法,深度优先遍历算法,广度优先遍历算法,Prime算法。):
- 图的遍历:深度优先遍历和广度优先遍历
- 【数据结构】邻接矩阵表示法的图的深度广度优先遍历递归和非递归遍历
- 【数据结构】邻接矩阵表示法的图的深度广度优先遍历递归和非递归遍历
- 算法与数据结构实验5:图的深度和广度优先遍历(邻接矩阵)
- 图的邻接矩阵存储:深度、广度优先遍历
- 图的邻接矩阵存储表示 深度优先和广度优先遍历
- Linux Single User Mode
- 简易计算器
- 数组:将一个int数组向左平移一次
- 有向图强连通分量 --Tarjan算法
- JS实现选项菜单(实例)
- 图的遍历(1)邻接矩阵的深度和广度优先遍历
- 美国开发3D电脑屏 手可“伸进”屏幕进行操作
- 前端开发之面向对象
- JS实现多选、反选 、全不选
- 初来乍到
- Javascript性能优化 - 事件委托
- C语言实现关机
- 20本必读的用户体验书目
- SAP系统的启动和停止