确定一个简单无向图(顶点数、和相关结点信息)利用邻接矩阵来实现存储。
源代码:
#include<iostream>
#include<stdlib.h>using namespace std;
const int Max=10; //图中最多顶点个数
int visited[Max]={0}; //设置已访问标志
template<class T>
class Graph
{
public:
Graph(T a[],int n,int e); //构造函数,建立具有n个顶点e条边的图
~Graph(){}; //析构函数为空
void BFST(int v); //深度优先遍历图
void DFST(int v); //广度优先遍历图
void Pvertex(); //输出顶点的邻接点
private:
T vertex[Max]; //存放图中顶点的一维数组
int arc[Max][Max]; //存放图中边的二维数组
int vertexNum, arcNum; //图中的顶点数和边数
};
template<class T>
Graph<T>::Graph(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;
for(k=0;k<arcNum;k++) //依次输入每一条边(两个顶点确定一条边)
{
cout<<"输入两点的编号:\n";
cin>>i;
cin>>j; //输入边依附的两个顶点编号
arc[i][j]=1;arc[j][i]=1; //有边标志
}
}
template<class T>
void Graph<T>::DFST(int v) //深度优先遍历图(递归调用)
{
int j;
cout<<vertex[v];
visited[v]=1; //防止重复访问相同顶点
for(j=0;j<vertexNum;j++)
if(arc[v][j]==1&&visited[j]==0) //访问未被访问的边
DFST(j);
}
template<class T>
void Graph<T>::BFST(int v) //广度优先遍历图(运用队列结构,非递归)
{
int Q[Max];
int front=-1; //初始化队列
int rear=-1;
cout<<vertex[v];
visited[v]=1;Q[++rear]=v; //被访问顶点入队
while(front!=rear) //队列为空时执行
{
v=Q[++front]; //将队头元素出队并送到v中
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 Graph<T>::Pvertex() //显示各个顶点的邻接点信息
{
int i;int j;
for(i=0;i<vertexNum;i++) //依次访问每个顶点
{
cout<<"顶点"<<vertex[i]<<"的邻接点为:"<<endl;
for(j=0;j<vertexNum;j++)
if(arc[i][j]==1) //两点确定一条边,即通过边可确定顶点的邻接点,且有可能为多个邻接点
cout<<vertex[j]<<" ";
cout<<endl;
}
}
int main()
{
char S[6]={'A','B','C','D','E'};
Graph<char> G(S,5,6);
for(int i=0;i<Max;i++)
{visited[i]=0;}
cout<<endl;
cout<<"深度优先遍历的序列为:";
G.DFST(0);
cout<<endl;
for(i=0;i<Max;i++)
{visited[i]=0;}
cout<<"广度优先遍历的序列为:";
G.BFST(0);
cout<<endl;
cout<<endl;
cout<<"各顶点的邻接点信息如下:"<<endl;
G.Pvertex();
cout<<endl;
return 0;
}
运行结果图: