简单无向图的邻接矩阵存储

#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;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值