图的遍历
来源:互联网 发布:软件流量是什么 编辑:程序博客网 时间:2024/05/29 09:25
#include <iostream>
#include <vector>
#include <queue>
#include <string>
#include <stdio.h>
const int Max = 26;
using namespace std;
class Graph{
private:
struct VertexNode{//节点信息
bool isVisited;
string data;
vector<int> vecNode;
VertexNode():isVisited(false) {}
};
struct Edge{
int beginNode;
int endNode;
};
int VertexNum;//节点个数;
int EdgeNum;//边的个数;
vector<VertexNode> vecVertex;//存储节点的容器
public:
Graph(int v):VertexNum(v),EdgeNum(0){//初始化
char tmp[Max];
VertexNode node;
for(int i =0;i<v;i++){
sprintf(tmp,"v%d",i+1);
node.data = tmp;
vecVertex.push_back(node);
}
}
void insertEdge(int b,int e){
Edge edge;
edge.beginNode = b;
edge.endNode = e;
vecVertex.at(b).vecNode.push_back(e);
EdgeNum++;
}
void showGraph(){
cout<<"show Graph:\n";
for(int i =0;i<VertexNum;i++){
cout<<"node "<<i<<"("<<vecVertex.at(i).data<<")";
for(int j =0;j<vecVertex.at(i).vecNode.size();j++)
cout<<"->"<<vecVertex.at(i).vecNode.at(j);
cout<<endl;
}
}
void depthFirstSearch(){
cout<<"depthFirstSearch: \n";
for(int i =0;i<VertexNum;i++){
if(!vecVertex.at(i).isVisited)
depthFirstSearch(i);
}
}
void depthFirstSearch(int v){
int iAdjacent = 0;
VertexNode node = vecVertex.at(v);
vecVertex.at(v).isVisited = true;
cout<<node.data<<endl;
for(int i =0;i<node.vecNode.size();i++){
iAdjacent = node.vecNode.at(i);
if(!vecVertex.at(iAdjacent).isVisited)
depthFirstSearch(iAdjacent);
}
}
void breadFirstSearch(){
int count = 0;
queue<int> bfs_queue;
cout<<"breadFirstSearch:\n";
for(int i = 0;i<VertexNum;i++){
vecVertex.at(i).isVisited = false;
}
for(int i =0;i<VertexNum;i++){
if(!vecVertex.at(i).isVisited){
vecVertex.at(i).isVisited = true;
cout<<vecVertex.at(i).data<<endl;
}
bfs_queue.push(i);
while(!bfs_queue.empty()){
VertexNode node = vecVertex.at(bfs_queue.front());
bfs_queue.pop();
for(int i =0;i<node.vecNode.size();i++){
if(!(vecVertex.at(node.vecNode.at(i)).isVisited)){
vecVertex.at(node.vecNode.at(i)).isVisited = true;
cout<<vecVertex.at(node.vecNode.at(i)).data<<endl;
bfs_queue.push(node.vecNode.at(i));
}
}
}
}
}
};
int main()
{
Graph graph(4);
graph.insertEdge(graph.makeEdge(0,3));
graph.insertEdge(graph.makeEdge(0,2));
graph.insertEdge(graph.makeEdge(1,0));
graph.insertEdge(graph.makeEdge(3,1));
graph.insertEdge(graph.makeEdge(3,0));
graph.showGraph();
graph.depthFirstSearch();
graph.breadFirstSearch();
cin.get();
cout << "Hello world!" << endl;
return 0;
#include <vector>
#include <queue>
#include <string>
#include <stdio.h>
const int Max = 26;
using namespace std;
class Graph{
private:
struct VertexNode{//节点信息
bool isVisited;
string data;
vector<int> vecNode;
VertexNode():isVisited(false) {}
};
struct Edge{
int beginNode;
int endNode;
};
int VertexNum;//节点个数;
int EdgeNum;//边的个数;
vector<VertexNode> vecVertex;//存储节点的容器
public:
Graph(int v):VertexNum(v),EdgeNum(0){//初始化
char tmp[Max];
VertexNode node;
for(int i =0;i<v;i++){
sprintf(tmp,"v%d",i+1);
node.data = tmp;
vecVertex.push_back(node);
}
}
void insertEdge(int b,int e){
Edge edge;
edge.beginNode = b;
edge.endNode = e;
vecVertex.at(b).vecNode.push_back(e);
EdgeNum++;
}
void showGraph(){
cout<<"show Graph:\n";
for(int i =0;i<VertexNum;i++){
cout<<"node "<<i<<"("<<vecVertex.at(i).data<<")";
for(int j =0;j<vecVertex.at(i).vecNode.size();j++)
cout<<"->"<<vecVertex.at(i).vecNode.at(j);
cout<<endl;
}
}
void depthFirstSearch(){
cout<<"depthFirstSearch: \n";
for(int i =0;i<VertexNum;i++){
if(!vecVertex.at(i).isVisited)
depthFirstSearch(i);
}
}
void depthFirstSearch(int v){
int iAdjacent = 0;
VertexNode node = vecVertex.at(v);
vecVertex.at(v).isVisited = true;
cout<<node.data<<endl;
for(int i =0;i<node.vecNode.size();i++){
iAdjacent = node.vecNode.at(i);
if(!vecVertex.at(iAdjacent).isVisited)
depthFirstSearch(iAdjacent);
}
}
void breadFirstSearch(){
int count = 0;
queue<int> bfs_queue;
cout<<"breadFirstSearch:\n";
for(int i = 0;i<VertexNum;i++){
vecVertex.at(i).isVisited = false;
}
for(int i =0;i<VertexNum;i++){
if(!vecVertex.at(i).isVisited){
vecVertex.at(i).isVisited = true;
cout<<vecVertex.at(i).data<<endl;
}
bfs_queue.push(i);
while(!bfs_queue.empty()){
VertexNode node = vecVertex.at(bfs_queue.front());
bfs_queue.pop();
for(int i =0;i<node.vecNode.size();i++){
if(!(vecVertex.at(node.vecNode.at(i)).isVisited)){
vecVertex.at(node.vecNode.at(i)).isVisited = true;
cout<<vecVertex.at(node.vecNode.at(i)).data<<endl;
bfs_queue.push(node.vecNode.at(i));
}
}
}
}
}
};
int main()
{
Graph graph(4);
graph.insertEdge(graph.makeEdge(0,3));
graph.insertEdge(graph.makeEdge(0,2));
graph.insertEdge(graph.makeEdge(1,0));
graph.insertEdge(graph.makeEdge(3,1));
graph.insertEdge(graph.makeEdge(3,0));
graph.showGraph();
graph.depthFirstSearch();
graph.breadFirstSearch();
cin.get();
cout << "Hello world!" << endl;
return 0;
}
//转自http://blog.csdn.net/wobuaishangdiao/article/details/8044916
//转自http://blog.csdn.net/wobuaishangdiao/article/details/8044916
//转自http://blog.csdn.net/wobuaishangdiao/article/details/8044916
0 0
- 图:图的遍历(深度优先遍历、广度优先遍历)
- java图的遍历方式(深度遍历、广度遍历)
- java图的遍历方式(深度遍历、广度遍历)
- 图的遍历(深度遍历和广度遍历)
- 图的遍历:深度优先遍历和广度优先遍历
- 图的 深度遍历 广度遍历
- 图的深度遍历和广度遍历
- 图的遍历(深度优先遍历)
- 图的遍历:深度优先遍历
- 图的遍历:宽度优先遍历
- 图的广度遍历和深度遍历
- 图的深度遍历和广度遍历
- 图的遍历-深度优先遍历
- 图的遍历-广度优先遍历
- 图的dfs遍历和bfs遍历
- 图的深度遍历和广度遍历
- 图的遍历算法-马遍历棋盘
- 图的遍历算法-马遍历棋盘
- hitTest:方法练习 - 不规则区域点击事件处理
- SVM-支持向量机算法概述
- IOS 开发 之 网络编程
- 使用脚本创建客户虚拟机模板 (文档 ID 2089028.1)
- 兼容IE的CSS写法
- 图的遍历
- Flask 简单博客用户文章评论部分
- 应用实例:照片识别 机器学习基础(10)
- hdu 1394 线段树
- 【BZOJ1088】[SCOI2005]扫雷Mine【枚举】【分类讨论】
- OCR/Vote disk 维护操作: (添加/删除/替换/移动) (文档 ID 1674859.1)
- C++语言之静态变量的运用
- kafka入门:简介、使用场景、设计原理、主要配置及集群搭建
- C#之旅 艰难的a+b(不完善版本)