C++实现图的邻接矩阵的创建以及其深度优先遍历和广度优先遍历

#include<iostream>
using namespace std;
typedef char vertextype;
typedef int edgetype;
#define maxvex 100
#define infinity 1000
#include<queue>
int visited[100];

class MGraph{

public:
	vertextype vexs[maxvex];
	edgetype arc[maxvex][maxvex];
	int numvertexs,numedges;//图的顶点数目和图的边的数目
	MGraph(const int &v,const int &e):numvertexs(v),numedges(e){}
	void creategraph();//创建图结构
	void displaygraph();//显示图的结构
	void DFS(int i);//深度优先遍历的子函数
	void DFSTraverse();
	void BFSTraverse();//定义广度遍历算法

};
void MGraph::creategraph()
{  cout<<"下面请输入顶点的元素类型值,输入的个数为"<<numvertexs<<endl;
	for(int i=0;i<numvertexs;++i)
	{
		cin>>vexs[i];
	}
	cin.clear();
	cout<<"下面请为邻接矩阵赋值,矩阵的大小为:"<<numvertexs<<"*"<<numvertexs<<endl;
	for(int i=0;i<numvertexs;++i)
	{
		for(int j=0;j<numvertexs;++j)
		{
			cin>>arc[i][j];
		}
	}

}
void MGraph::displaygraph()
{   cout<<"下面输出的是顶点中的元素"<<endl;
	for(int i=0;i<numvertexs;++i)
	{
		cout<<vexs[i]<<" ";
	}
	cout<<endl;

	for(int i=0;i<numvertexs;++i)
	{
		for(int j=0;j<numvertexs;++j)
		{
			cout<<arc[i][j]<<'\t';
		}
		cout<<endl;
	}
}
//下面定义深度优先的函数
void MGraph::DFS(int i)
{
	int j;
	visited[i]=true;
	cout<<"深度优先输出的结点信息"<<vexs[i]<<endl;
	for(j=0;j<numvertexs;++j)
	{
		if(arc[i][j]==1&&!visited[j])
			DFS(j);
	}
}
void MGraph::DFSTraverse()
{
	int i;
	for(i=0;i<numvertexs;++i)
	{
		visited[i]=0;
	}
	for(i=0;i<numvertexs;++i)
	{
		if(!visited[i])
			DFS(i);
	}
}
void MGraph::BFSTraverse()
{
	int i,j;
	queue<int> q;
	for(i=0;i<numvertexs;++i)
		visited[numvertexs]=0;
	for(i=0;i<numvertexs;++i)
	{
		if(!visited[i])
		{
			visited[i]=1;
			cout<<"广度遍历的结点的信息为"<<vexs[i]<<endl;
			q.push(i);
			while(!q.empty())
			{   int k;
			k=q.front();
			q.pop();
				for(j=0;j<numvertexs;++j)
				{
					if(arc[i][j]==1&&!visited[j])
					{
						visited[j]=1;
						cout<<"广度遍历的结点的信息为"<<vexs[i]<<endl;
						q.push(j);
					}
				}
			}
		}

	}

}
int main()
{    MGraph G(4,5);
    G.creategraph();
	G.displaygraph();
	//G.DFSTraverse();
	G.BFSTraverse();

	system("pause");
	return 0;
}

时间: 2024-12-24 01:34:11

C++实现图的邻接矩阵的创建以及其深度优先遍历和广度优先遍历的相关文章

基于邻接矩阵存储的图的深度优先遍历和广度优先遍历

图的存储结构相比较线性表与树来说就复杂很多,对于线性表来说,是一对一的关系,所以用数组或者链表均可简单存放.树结构是一对多的关系,所以我们要将数组和链表的特性结合在一起才能更好的存放. 那么我们的图,是多对多的情况,另外图上的任何一个顶点都可以被看作是第一个顶点,任一顶点的邻接点之间也不存在次序关系. 仔细观察以下几张图,然后深刻领悟一下: 因为任意两个顶点之间都可能存在联系,因此无法以数据元素在内存中的物理位置来表示元素之间的关系(内存物理位置是线性的,图的元素关系是平面的). 如果用多重链表

基于邻接表存储的图的深度优先遍历和广度优先遍历

一.深度优先遍历是连通图的一种遍历策略.其基本思想如下: 设x是当前被访问顶点,在对x做过访问标记后,选择一条从x出发的未检测过的边(x,y).若发现顶点y已访问过,则重新选择另一条从x出发的未检测过的边,否则沿边(x,y)到达未曾访问过的y,对y访问并将其标记为已访问过:然后从y开始搜索,直到搜索完从y出发的所有路径,即访问完所有从y出发可达的顶点之后,才回溯到顶点x,并且再选择一条从x出发的未检测过的边.上述过程直至从x出发的所有边都已检测过为止. 例如下图中: 1.从0开始,首先找到0的关

以邻接表作为存储结构的图的深度优先遍历和广度优先遍历(c++版)

一.图的存储 用邻接表法存储图,存储结构分为两部分,一部分为存储图的所有顶点的数组,另一部分为挂载在数组的每个元素后面的用来表示顶点的邻接点的链表. 1.存储顶点的结构单元为: class vnode { public: string nodename; bool visted;//进行图的遍历时用于标记图是否被访问过 node *next; vnode() { visted = false; next = NULL; } }; 链表的结构单元为: class node { public: st

图的遍历---深度优先遍历与广度优先遍历

对下图进行遍历,分别采用深度优先和广度优先 1.深度优先遍历的主要思想:首先从一个未被访问的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点: 当没有未访问过的顶点时,则回到上一个顶点,继续试探访问别的顶点,直到所有顶点都被访问. 显然,深度优先遍历是沿着图的某一条分支遍历直到末端,然后回溯,再沿着另一条进行同样的遍历,直到所有顶点被访问. /*深度优先搜索算法遍历图的各个顶点*/ #include<stdio.h> int n, sum, book[101]; int e[101][101

数据结构(三十二)图的遍历之广度优先遍历

一.广度优先遍历算法描述 广度优先遍历(Breadth_First_Search),又称为广度优先搜索,简称BFS.图的广度优先遍历类似于树的层序遍历. BFS算法描述:从图中的某个顶点v开始,先访问该顶点,再依次访问该顶点的每一个未被访问过的邻接点w1,w2,...:然后按此顺序访问顶点w1,w2...的各个还未 被访问过的邻接点.重复上述过程,直到图中的所有顶点都被访问过为止. 以下图为例子,顶点访问序列为{A B F C I G E D H} 二.广度优先遍历算法实现 原文地址:https

java实现图的遍历(深度优先遍历和广度优先遍历)

package arithmetic.graphTraveral;import java.util.LinkedList;import java.util.Queue; /** * 这个例子是图的遍历的两种方式 * 通过它,使我来理解图的遍历 * Created on 2013-11-18 * @version 0.1 */public class GraphTraveral{ // 邻接矩阵存储图 // --A B C D E F G H I // A 0 1 0 0 0 1 1 0 0 //

用邻接矩阵实现的深度优先遍历和广度优先遍历

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <queue> 4 #include <algorithm> 5 using namespace std; 6 7 #define ERROR -1 8 #define MAXVEX 100 9 10 typedef int VertexType; 11 typedef int VRType; 12 typedef int EdgeType; 13 b

【图的遍历】广度优先遍历(DFS)、深度优先遍历(BFS)及其应用

无向图满足约束条件的路径 • 目的:掌握深度优先遍历算法在求解图路径搜索问题的应用 内容:编写一个程序,设计相关算法,从无向图G中找出满足如下条件的所有路径  (1)给定起点u和终点v.  (2)给定一组必经点,即输出的路径必须包含这些点.  (3)给定一组必避点,即输出的路径必须不能包含这些点. 来源:<数据结构教程(第五版)>李春葆著,图实验11. 原文地址:https://www.cnblogs.com/sunbines/p/9028903.html

邻接表c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)

graph.c #include <stdio.h> #include <stdlib.h> #include <limits.h> #include "aqueue.h" #define MAX_NUM 100 typedef char node_type; typedef struct arc_node { int pos; int distance; struct arc_node * next; } Arc_node;//保存Node节点的相