这是上一篇:图的存储方式——邻接矩阵
http://blog.csdn.net/dala_da/article/details/79302329
从整体来看,我个人认为深度优先有点类似二叉树先序遍历,都是将访问节点压入到栈,然后看是否有延伸节点,若没有则出栈,返回到上一节点;而广度优先则与二叉树层次遍历比较像,离出发节点比较近的点先被访问。因此本篇我采用非递归的方式进行图的遍历,分别采用的是站和队列的数据结构
#include<iostream>
#include<limits.h>
#include<stack>
#include<queue>
using namespace std;
#define MAXVEX 100
typedef struct
{
int matrix[MAXVEX][MAXVEX];
int numNodes, numEdges;
} Graph;
void CreateGraph(Graph *Gp)
{
int i, j, k, w;
bool isDirected;
cout<<"无向图请输入0,有向图请输入1"<<endl;
cin>>isDirected;
cout<<"请输入顶点数和边数(空格分隔):"<<endl;
cin>>Gp->numNodes>>Gp->numEdges;;
for (i=1;i<=Gp->numNodes;i++)
{
for (j=1;j<=Gp->numNodes;j++)
{
if (i==j)
Gp->matrix[i][j]=0;
else
Gp->matrix[i][j]=INT_MAX;
}
}
cout<<"请输入边(vi, vj)和权值w,三个变量空格分隔即可:"<<endl;
for (k=0;k<Gp->numEdges;k++)
{
cin>>i>>j>>w;
Gp->matrix[i][j]=w;
if(!isDirected)
Gp->matrix[j][i]=Gp->matrix[i][j];
}
}
void ShowGraph(Graph M){
int i, j;
for(i=1;i<=M.numNodes;i++){
for(j=1;j<=M.numNodes;j++){
if(M.matrix[i][j]!=INT_MAX)
cout<<M.matrix[i][j]<<" ";
else
cout<<"*"<<" ";
}
cout<<endl;
}
}
void Graph_Dfs(Graph M, int visiting_Node){
bool *isVisited=new bool[M.numNodes];
for(int i=1;i<M.numNodes;i++)
isVisited[i]=false;
int visited_count=0;//记录已经访问过的节点
stack<int> p;
while(visited_count<M.numNodes){
if(isVisited[visiting_Node]==false){
cout<<visiting_Node<<" ";
visited_count++;
}
p.push(visiting_Node);
isVisited[visiting_Node]=true;
int j;
for(j=1;j<=M.numNodes;j++){
if(M.matrix[visiting_Node][j]!=0 && M.matrix[visiting_Node][j]!=INT_MAX && isVisited[j]==false )
break;
}
if(j==M.numNodes+1){
p.pop();
if(!p.empty()){
visiting_Node=p.top();
p.pop();
}
else
break;
}
else
visiting_Node=j;
}
}
void Graph_Bfs(Graph M, int visiting_Node){
bool *isVisited=new bool[M.numNodes];
for(int i=1;i<M.numNodes;i++)
isVisited[i]=false;
int visited_count=0;//记录已经访问过的节点
queue<int> p;
while(visited_count<M.numNodes){
if(isVisited[visiting_Node]==false){
cout<<visiting_Node<<" ";
visited_count++;
}
isVisited[visiting_Node]=true;
p.push(visiting_Node);
for(int j=1;j<=M.numNodes;j++){
if(M.matrix[visiting_Node][j]!=0 && M.matrix[visiting_Node][j]!=INT_MAX && isVisited[j]==false){
p.push(j);
}
}
p.pop();
visiting_Node=p.front();
}
}
int main(void)
{
Graph M;
CreateGraph(&M);
cout<<"邻接矩阵为:"<<endl;
ShowGraph(M);
cout<<"该图的深度遍历为:"<<endl;
Graph_Dfs(M,1);
cout<<endl;
cout<<"该图的广度遍历为:"<<endl;
Graph_Bfs(M,1);
return 0;
}
运行结果: