#include<iostream>
using namespace std;
const int maxsize=10;
int visited[maxsize]={0};//全局数组变量visited初始化
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 next();//输出邻接点
private:
T vertex[maxsize];//存放图中顶点的数组
int arc[maxsize][maxsize];//存放图中边的数组
int vertexnum,arcnum;//图的顶点数和边数
};
template<class T>
mgraph<T>::mgraph(T a[],int n,int e)
{
int i,j,k;
vertexnum=n;arcnum=e;
for(i=0;i<vertexnum;i++)//存储图的顶点信息
vertex[i]=a[i];
for(i=0;i<vertexnum;i++)//初始化图的邻接矩阵
for(j=0;j<vertexnum;j++)
arc[i][j]=0;
cout<<"请输入边的两个顶点的序号:"<<endl;
for(k=0;k<arcnum;k++)//存储图的边信息
{
cin>>i>>j;
arc[i][j]=1;arc[j][i]=1;
}
cout<<"邻接矩阵如下:"<<endl;
for(i=0;i<vertexnum;i++)
{
for(j=0;j<vertexnum;j++)
cout<<arc[i][j]<<" ";
if(j%5==0)cout<<endl;
}
cout<<"顶点次序依次为:";
for(i=0;i<vertexnum;i++)
{
cout<<vertex[i]<<" ";
}
cout<<endl;
}
template<class T>
void mgraph<T>::DFSTraverse(int v)//深度优先遍历图
{
cout<<vertex[v]<<" ";
visited[v]=1;
for(int j=0;j<vertexnum;j++)
if(arc[v][j]==1&&visited[j]==0)
DFSTraverse(j);
}
template<class T>
void mgraph<T>::BFSTraverse(int v)//广度优先遍历图
{
int q[maxsize];//假设队列采用顺序存储且不会发生溢出
int front=-1,rear=-1;//初始化队列
cout<<vertex[v]<<" ";
visited[v]=1;q[++rear]=v;//被访问顶点入队
while(rear!=front)
{
v=q[++front];
for(int j=0;j<vertexnum;j++)
if(arc[v][j]==1&&visited[j]==0)
{
cout<<vertex[j]<<" ";visited[j]=1;q[++rear]=j;
}
}
}
template<class T>
void mgraph<T>::next()
{
for(int i=0;i<vertexnum;i++)
{
cout<<vertex[i]<<"的邻接点为:";
for(int j=0;j<vertexnum;j++)
if(arc[i][j]==1&&visited[j]==0)
cout<<vertex[j]<<" ";
cout<<endl;
}
}
int main()
{
char ch[]={'A','B','C','D','E'};//顶点信息
mgraph<char>mg(ch,5,6);//图中顶点的类型为char型
for(int i=0;i<maxsize;i++)//初始化图中所有顶点均未被访问
visited[i]=0;
cout<<"深度优先遍历序列是:";
mg.DFSTraverse(0);//从顶点0出发深度优先遍历图
cout<<endl;
for(i=0;i<maxsize;i++)//初始化图中所有顶点均未被访问
visited[i]=0;
cout<<"广度优先遍历序列是:";
mg.BFSTraverse(0);//从顶点0出发广度优先遍历图
cout<<endl;
for(i=0;i<maxsize;i++)
visited[i]=0;
mg.next();
return 0;
}