构造无向图,进行深度优先遍历和广度优先遍历

这篇具有很好参考价值的文章主要介绍了构造无向图,进行深度优先遍历和广度优先遍历。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一. 实验要求
实现利用邻接矩阵构造无向图的算法,在此基础上进行深度优先遍历和广度优先遍历。
二. 实验目的
通过该实验,使学生掌握图的几种存储结构,理解图的深度优先和广度优先遍历算法的思想和实现办法
三、设计思想
1.创建网图。网图是利用邻接矩阵来存储的。先从键盘输入图的顶点树vex和边数arc。创建一个正方形矩阵,边数等于vex。然后输入这vex个顶点的符号。再输入图中i个顶点和j个顶点相连,使矩阵中的第i行第j列和第j行第i列的值为1,表示两个顶点i和j相通,矩阵中其他元素的值为0,表示这两个顶点之间无线。
2.输出邻接矩阵。根据创建网图中创建的邻接矩阵,利用for循环来控制输出邻接矩阵即可。
3.深度优先遍历。从第一个顶点1开始遍历。先输出1。借用辅助数组vis,以便判断顶点是否已经遍历过,已被遍历过的元素为true,没有遍历过的为false。利用for循环,如果矩阵中第vex行的第i个是0或是已被调用过的顶点,则continue一次for循环;否则,继续深度遍历这个未被调用过的第i个顶点。
4.广度优先遍历。构建一个置空的辅助队列que,借助辅助数组vis,以便判断顶点是否已经遍历过。将第一个顶点vex入队,vis[vex]=true。当队列que不为空时,进行while循环:将队列que的队头元素输出,并利用for循环寻找邻接矩阵中第vex行是否有未被访问过的顶点,如果有,则入队,并且辅助数组vis中的值改为true。

三. 主要源代码

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#define N 100
using namespace std;

bool vis[N];
struct Graph{
	int vex[N];
	int graph[N][N];
	int sum_vex, sum_arc;
};
void print();
void init(Graph &g) {
	for (int i = 1; i <= g.sum_vex; ++i) {
		for (int j = 1; j <= g.sum_vex; ++j) {
			g.graph[i][j] = 0;
		}
	}
	return;
}
void creat(Graph &g) {
	cout << "请输入顶点数和边数:";
	cin >> g.sum_vex >> g.sum_arc;
	cout << endl;
	init(g);
	cout << "请输入" << g.sum_vex << "个顶点:";
	for (int i = 1; i <= g.sum_vex; ++i) {
		cin >> g.vex[i];
	}
	sort(g.vex + 1, g.vex + g.sum_vex + 1);
	cout << "请输入" << g.sum_arc << "个边: ";
	for (int i = 0; i < g.sum_arc; ++i) {
		int s, e;
		cin >> s >> e;
		g.graph[s][e] = g.graph[e][s] = 1;
	}
	return;
}
void print_graph(Graph g) {
	for (int i = 1; i <= g.sum_vex; ++i) {
		for (int j = 1; j <= g.sum_vex; ++j) {
			cout << g.graph[i][j] << " ";
		}
		cout << endl;
	}

}
void DFS(Graph g, int vex) {
	cout << vex << " ";
	vis[vex] = true;
	for (int i = 1; i <= g.sum_vex; ++i) {
		if (g.graph[vex][g.vex[i]] == 0 ||  vis[g.vex[i]] == true)	continue;
		DFS(g, g.vex[i]);
	}
}

struct Node{
	int data;
	Node *next;
};
struct Queue{
	Node *front, *rear;
};
void Init(Queue &Q) {
	Q.front = Q.rear = (Node*)malloc(sizeof(Node));
	Q.front->next = NULL;
	Q.front->data = 0;
}
int Empty(Queue Q) {
	if (Q.front == Q.rear)	return true;
	return false;
}
int Top(Queue Q, int &e) {
	if (Empty(Q))	return -1;
	e = Q.front->next->data;
	return 1;
}
void Push(Queue &Q, int e) {
	Node *p = (Node*)malloc(sizeof(Node));
	p->data = e;
	p->next = NULL;
	Q.rear->next = p;
	Q.rear = p;
	Q.front->data++;
}
int Pop(Queue &Q, int &e) {
	if (Empty(Q))	return -1;
	Node *p;
	p = Q.front->next;
	e = p->data;
	Q.front->next = p->next;
	if (p == Q.rear)	Q.rear = Q.front;
	free(p);
	Q.front->data--;
	return 1;
}

void BFS(Graph g, int vex) {
	for (int i = 1; i <= g.sum_vex; ++i)
		vis[g.vex[i]] = false;
	Queue que;
	Init(que);
	Push(que, vex);
	vis[vex] = true;
	while (!Empty(que)) {
		int top;
		Pop(que, top);
		cout << top << " ";
		for (int i = 1; i <= g.sum_vex; ++i) {
			if (vis[g.vex[i]] || g.graph[top][g.vex[i]] == 0)	continue;
			vis[g.vex[i]] = true;
			Push(que, g.vex[i]);
		}
	}
}
int main() {
	print();
	Graph g;
    int t;
	while (cin >> t) {
		if (t == 5)	break;
		switch (t) {
			case 1:	// 创建
				creat(g);
				break;
			case 2: // 输出
				print_graph(g);
				break;
			case 3: // 深度
				for (int i = 1; i <= g.sum_vex; ++i)
					vis[g.vex[i]] = false;
				DFS(g, g.vex[1]);
				break;
			case 4: // 广度
				BFS(g, g.vex[1]);
				break;

			default:
				printf("输入序号错误! ");
				break;
		}
		printf("\n请输入操作代码:");
	}
	return 0;
}

void print() {
	cout << "**************************************************************\n";
	cout << "******************  1.创建网图              ******************\n";
	cout << "******************  2.输出邻接矩阵          ******************\n";
	cout << "******************  3.深度优先遍历          ******************\n";
	cout << "******************  4.广度优先遍历          ******************\n";
	cout << "******************  5.退出                  ******************\n";
	cout << "请输入你的选择:";
} 

无向图的深度优先遍历和广度优先遍历,深度优先,图论,算法

 文章来源地址https://www.toymoban.com/news/detail-752460.html

到了这里,关于构造无向图,进行深度优先遍历和广度优先遍历的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 图的广度优先遍历和深度优先遍历

    前言:在上一篇博客我们学习了图的基本操作,包括图的建立、结点插入与删除等操作,怎么判断我们建立的图是否正确,很简单把它输出出来就是,但是如何输出它,这就是图的遍历问题了。 图的遍历是指从图中的某一顶点出发,按照某种搜索方法沿着图中的边对图中的所

    2024年02月11日
    浏览(50)
  • 图的两种遍历:深度优先遍历+广度优先遍历

    深度优先遍历 是指按照 深度方向 搜索,它类似于树的先根遍历,是树的先根遍历的推广。 基本思想(通俗) 选一条路走到 底 ,直到 走不通 ,就 原路返回 看看 是否还有路 可走,如果返回到起点还无路可走,说明深度优先遍历已完成。 这是要深度遍历的 无向图 :    深

    2024年02月06日
    浏览(44)
  • 数据结构上机实验——图的实现(以无向邻接表为例)、图的深度优先搜索(DFS)、图的广度优先搜索(BFS)

      图采用邻接表存储结构,编程实现图的深度优先搜索和广度优先搜索算法。              2.1创建图 2.1.1定义图的顶点、边及类定义   我们定义一个 邻接表类(ALGraph) 。这里实现一些基础的数据结构。要注意结构体的嵌套。    Edge: 用于表示图中的边

    2024年02月04日
    浏览(52)
  • 图的二种遍历-广度优先遍历和深度优先遍历

    1.树的广度优先遍历 这样一个图中,是如何实现广度优先遍历的呢,首先,从1遍历完成之后,在去遍历2,3,4,最后遍历5 ,6 , 7  , 8。这也就是为什么叫做广度优先遍历,是一层一层的往广的遍历 不存在“回路”,搜索相邻的结点时,不可能搜到已经访问过的结点 树的广度优

    2024年02月02日
    浏览(49)
  • 图的遍历-深度优先遍历与广度优先遍历(C语言)

    图的遍历 概念:指的是从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次。 邻接矩阵及邻接表的创建 : 图的存储结构-无向邻接矩阵与无向邻接表(C语言). 结构定义 邻接矩阵的深度优先遍历操作 邻接矩阵的深度优先递归算法 结构定义 邻接表的深度优先遍

    2024年02月06日
    浏览(46)
  • 图的遍历(广度优先遍历BFS,深度优先遍历DFS)

    目录 图的遍历概念: 图的广度优先遍历(BFS): 代码实现如下: 测试如下: 注意: 图的深度优先遍历(DFS): 代码实现如下: 测试如下: 总代码: 结语: 给定一个图G和其中任意一个顶点v0,从v0出发,沿着图中各边访问图中的所有顶点,且每个顶点仅被遍历一次。\\\"遍

    2024年02月21日
    浏览(54)
  • 大话数据结构-图的深度优先遍历和广度优先遍历

      图的遍历分为深度优先遍历和广度优先遍历两种。   深度优先遍历(Depth First Search),也称为深度优先搜索,简称DFS,深度优先遍历,是指从某一个顶点开始,按照一定的规则,访问并记录下一个未访问顶点。对于非连通图,则是按连通分量,采用同一规则进行深度优

    2024年02月04日
    浏览(58)
  • 图的遍历之 深度优先搜索和广度优先搜索

    深度优先搜索的图文介绍 1. 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至

    2024年02月13日
    浏览(52)
  • 蛮力算法之深度优先遍历和广度优先遍历——图的深度优先遍历和广度优先遍历,附带案例:迷宫问题及矩阵中传染性传播问题

    这两种搜索方法本质上都是基于蛮力法思路 这两种搜索方法对有向图和无向图都适用 1.1 邻接矩阵 邻接矩阵示意图: 1.2 邻接表 注意:边结点代表的是图中的边,而并非图中的结点;头结点才表示图中的结点;头结点身后所连接的为边结点 邻接表示意图:(一般默认为出边

    2024年02月05日
    浏览(64)
  • (超详细)C++图的深度优先遍历、广度优先遍历(数据结构)

            根据下图,编写代码实现图的深度优先遍历和广度优先遍历。          按照英文字母顺序,以邻接表为存储结构,实现图的深度优先和广度优先遍历。遍历的顺序从顶点a开始。 以用户指定的结点为起点,分别输出每种遍历下的结点访问序列。   (1)从顶点a,

    2024年02月08日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包