邻接矩阵

MGraph.h

#ifndef MGraph_H//避免包含MGraph.h的头文件
#define MGraph_H
const int MaxSize=10;//图中最多的顶点
template<class DataType>

class MGraph
{
	public:
		MGraph(DataType a[],int n,int e);//建立n个顶点 e条变
		~MGraph(){	}
		void DFSTraverse(int v);//深度遍历 
		void BFSTraverse(int v);//广度遍历,v是指顶点的下标
	private:
	DataType vertex[MaxSize];//顶点数组 
	int arc[MaxSize][MaxSize];//存放图中边的数组
	int vertexNum,arcNum;
	 
};
#endif;

MGraph.cpp

#include<iostream>
using namespace std;
#include"MGraph.h"//引入MGraph.h的声明

template <class DataType>
MGraph<DataType>::MGraph(DataType 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<<"请输入边的两个顶点的序号:";
			cin>>i>>j;
			arc[i][j]=1;
			arc[j][i]=1;
			 
		}
}
		template<class DataType>
		void MGraph<DataType>::DFSTraverse(int v)//深度遍历
		{int visited[10]={0};
		cout<<vertex[v];//v是下标 
		
		visited[v]=1; //先定义
		
		for(int j=0;j<vertexNum;j++)
		if(arc[v][j]=1&&visited[j]==0)//前者说明两个点是邻接点 后边说明没有被访问过
		DFSTraverse(j);
	}
	    template<class DataType>
	    void MGraph<DataType>::BFSTraverse(int v)//广度优先
		{int visited[10]={0};
			int Q[MaxSize];//假设队列采用顺序存储并不会发生溢出
			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;
				}
			} 
		} 
MGraph_main.cpp

#include<iostream>
using namespace std;
#include"MGraph.cpp"
int visited[MaxSize]={0};
int  main()
{
	char ch[]={'A','B','C','D','E'};
	MGraph<char>MG(ch,5,6);
	for(int i=0;i<MaxSize;i++)
    visited[i]=0;
    cout<<"深度优先便利顺序是:";
	MG.DFSTraverse(0);
	cout<<endl;
	for(int i=0;i<MaxSize;i++)
	visited[i]=0;
	cout<<"广度优先遍历顺序是:";
	MG.BFSTraverse(0);
	cout<<endl;
	return 0; 
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值