#include<iostream.h>
const int Max = 10;
template<class T>
class MGraph
{
public:
MGraph(T a[],int n,int e); //n个结点e条边的图
~MGraph(){}
void DFSTraverse(int v); //深度优先遍历
void BFSTraverse(int v); //广度优先遍历
void visit();
private:
T vertex[Max];
int arc[Max][Max];
int vertexNum,arcNum;
int visited[Max];
int Q[Max];
int front,rear;
};
//构造函数
template<class T>
MGraph<T>::MGraph(T a[],int n,int e)
{
int i,j;
vertexNum=n; arcNum=e;
for(i=0;i<vertexNum;i++)
{
vertex[i] = a[i];
}
for(i=0;i<vertexNum;i++)
for(int j=0;j<vertexNum;j++)
arc[i][j] = 0;
cout<<"请输入边(两端的顶点下标):"<<endl;
for(int k=0;k<arcNum;k++)
{
cin>>i>>j;
arc[i][j]=1;
arc[j][i]=1;
cout<<"该边为:"<<vertex[i]<<vertex[j]<<endl;
}
}
//定义一个将visiited[]初始化为0的函数,每次遍历前先调用该函数
template<class T>
void MGraph<T>::visit()
{
for(int i=0;i<Max;i++){
visited[i]=0;
}
}
//深度优先遍历
template<class T>
void MGraph<T>::DFSTraverse(int v) //以v为起点
{
cout<<vertex[v]; visited[v]=1;
for(int j=0;j<vertexNum;j++){
if(arc[v][j]==1 && visited[j]==0){
DFSTraverse(j); //访问与v相邻且未被访问过的点
}
}
}
//广度优先遍历
template<class T>
void MGraph<T>::BFSTraverse(int v)
{
//将队列置为空
front=rear=-1;
cout<<vertex[v]; visited[v]=1; Q[++rear]=v; //结点v入队
while(front!=rear)
{
v=Q[++front]; //v出队
for(int j=0;j<vertexNum;j++){ //访问所有与v相邻的顶点
if(arc[v][j]==1 && visited[j]==0)
{
cout<<vertex[j]; visited[j]=1;Q[++rear]=j;
}
}
}
}
//主函数
int main()
{
char arr[Max];
int a,c=0,flag=1,tab,n;
cout<<"请按序输入图的顶点(输入“#”结束):";
for(int i=0; i<Max; i++)
{
cin>>arr[i];
if(arr[i] == '#') break;
c++;
}
cout<<"请输入该图的边数:";
cin>>a;
MGraph<char> m(arr,c,a);
cout<<"请选择深度/广度优先遍历:"<<endl;
while(flag)
{
cout<<"[1]深度 [2]广度\t:";
cin>>tab;
cout<<"请输入起点下标:";
switch(tab)
{
case 1:
{
cin>>n;
m.visit();
cout<<"[深度]";
m.DFSTraverse(n);
cout<<endl;
break;
}
case 2:
{
cin>>n;
m.visit();
cout<<"[广度]";
m.BFSTraverse(n);
cout<<endl;
break;
}
default:
{
flag=0;
cout<<"不存在该命令!"<<endl;
break;
}
}
}
return 0;
}
const int Max = 10;
template<class T>
class MGraph
{
public:
MGraph(T a[],int n,int e); //n个结点e条边的图
~MGraph(){}
void DFSTraverse(int v); //深度优先遍历
void BFSTraverse(int v); //广度优先遍历
void visit();
private:
T vertex[Max];
int arc[Max][Max];
int vertexNum,arcNum;
int visited[Max];
int Q[Max];
int front,rear;
};
//构造函数
template<class T>
MGraph<T>::MGraph(T a[],int n,int e)
{
int i,j;
vertexNum=n; arcNum=e;
for(i=0;i<vertexNum;i++)
{
vertex[i] = a[i];
}
for(i=0;i<vertexNum;i++)
for(int j=0;j<vertexNum;j++)
arc[i][j] = 0;
cout<<"请输入边(两端的顶点下标):"<<endl;
for(int k=0;k<arcNum;k++)
{
cin>>i>>j;
arc[i][j]=1;
arc[j][i]=1;
cout<<"该边为:"<<vertex[i]<<vertex[j]<<endl;
}
}
//定义一个将visiited[]初始化为0的函数,每次遍历前先调用该函数
template<class T>
void MGraph<T>::visit()
{
for(int i=0;i<Max;i++){
visited[i]=0;
}
}
//深度优先遍历
template<class T>
void MGraph<T>::DFSTraverse(int v) //以v为起点
{
cout<<vertex[v]; visited[v]=1;
for(int j=0;j<vertexNum;j++){
if(arc[v][j]==1 && visited[j]==0){
DFSTraverse(j); //访问与v相邻且未被访问过的点
}
}
}
//广度优先遍历
template<class T>
void MGraph<T>::BFSTraverse(int v)
{
//将队列置为空
front=rear=-1;
cout<<vertex[v]; visited[v]=1; Q[++rear]=v; //结点v入队
while(front!=rear)
{
v=Q[++front]; //v出队
for(int j=0;j<vertexNum;j++){ //访问所有与v相邻的顶点
if(arc[v][j]==1 && visited[j]==0)
{
cout<<vertex[j]; visited[j]=1;Q[++rear]=j;
}
}
}
}
//主函数
int main()
{
char arr[Max];
int a,c=0,flag=1,tab,n;
cout<<"请按序输入图的顶点(输入“#”结束):";
for(int i=0; i<Max; i++)
{
cin>>arr[i];
if(arr[i] == '#') break;
c++;
}
cout<<"请输入该图的边数:";
cin>>a;
MGraph<char> m(arr,c,a);
cout<<"请选择深度/广度优先遍历:"<<endl;
while(flag)
{
cout<<"[1]深度 [2]广度\t:";
cin>>tab;
cout<<"请输入起点下标:";
switch(tab)
{
case 1:
{
cin>>n;
m.visit();
cout<<"[深度]";
m.DFSTraverse(n);
cout<<endl;
break;
}
case 2:
{
cin>>n;
m.visit();
cout<<"[广度]";
m.BFSTraverse(n);
cout<<endl;
break;
}
default:
{
flag=0;
cout<<"不存在该命令!"<<endl;
break;
}
}
}
return 0;
}