头文件"Graph.h"
#include<iostream>
#include<queue>
#define UNVISITED 0
#define VISITED 1
#define INEXIST 0
#define EXIST 1
using namespace std;
template<class T>
class AdjGraph{
public:
T *vertex;//顶点表
int **edge;//边表
int *mark;//记录顶点是否被访问
int vertexNum,edgeNum;//顶点数目,边数目
AdjGraph(){
vertexNum=0;
edgeNum=0;
}
~AdjGraph(){
delete [] vertex;
delete [] mark;
for(int i=0;i<vertexNum;i++){
delete [] edge[i];
}
delete [] edge;
}
void creatGraph(){
int a,b;
cout<<"请输入顶点总数:"<<endl;
cin>>vertexNum;
vertex=new T [vertexNum];//建立顶点表
mark=new int [vertexNum];
for(int i=0;i<vertexNum;i++)
mark[i]=UNVISITED;
//建立边表
edge=new int* [vertexNum];
for(int i=0;i<vertexNum;i++)
edge[i]=new int [vertexNum];
cout<<"请输入边总数:"<<endl;
cin>>edgeNum;
for(int i=0;i<vertexNum;i++)
for(int j=0;j<vertexNum;j++)
edge[i][j]=INEXIST;
cout<<"请输入每个顶点对应的信息:"<<endl;
for(int i=0;i<vertexNum;i++)
cin>>vertex[i];
cout<<"请输入存在边的两个顶点:"<<endl;
for(int i=0;i<edgeNum;i++){
cin>>a>>b;
edge[a][b]=EXIST;
edge[b][a]=EXIST;
}
}
void DFS(int v){
mark[v]=VISITED;
cout<<vertex[v]<<" ";
for(int i=0;i<vertexNum;i++)
if(edge[v][i]&&!mark[i])
DFS(i);
}
void DFSTraverse(){
for(int i=0;i<vertexNum;i++)
mark[i]=UNVISITED;
for(int i=0;i<vertexNum;i++)
if(!mark[i])
DFS(i);
}
void BFS(int v){
queue<int> vertexQueue;
mark[v]=VISITED;
cout<<vertex[v]<<" ";
vertexQueue.push(v);
while(!vertexQueue.empty()){
int u=vertexQueue.front();
vertexQueue.pop();
for(int i=0;i<vertexNum;i++)
if(edge[u][i]&&!mark[i]){
cout<<vertex[i]<<" ";
mark[i]=VISITED;
vertexQueue.push(i);
}
}
}
void BFSTraverse(){
for(int i=0;i<vertexNum;i++)
mark[i]=UNVISITED;
for(int i=0;i<vertexNum;i++)
if(!mark[i])
BFS(i);
}
};
源文件"main.cpp"
#include<iostream>
#include"Graph.h"
using namespace std;
int main(){
AdjGraph<char> G;
G.creatGraph();
G.DFSTraverse();
cout<<endl;
G.BFSTraverse();
return 0;
}