#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