图的广度优先搜索

数据结构之图的广度优先搜索 遍历原则: 从图中指定的 阅读详情
package com.data.struct;

import java.util.Random;

public class Graphic {
	private Node[] list;
	private NodeArrayQueue queue;
	public Graphic(int v,int e){
		list=new Node[v];
		for(int i=0;i<v;i++){
			Node node=new Node();
			node.id=i;
			list[i]=node;
		}
		for(int i=0;i<e;i++){
			int v1=new Random().nextInt(v);
			int v2=new Random().nextInt(v);
			if(v1==v2){
				continue;
			}
			while(true){
				Node node=list[v1];
				boolean already=false;
				while(node.next!=null){
					if(node.next.id==v2){
						already=true;
						break;
					}
					node=node.next;
				}
				if(already==true){
					break;
				}
				Node ex=new Node();
				ex.id=v2;
				node.next=ex;
				break;
			}
		}
		queue=new NodeArrayQueue((v*(v-1)/2)+5);
	}
	public void broadFirstSearch()throws Exception{
		broadFirstSearch(list[0]);
	}
	public void broadFirstSearch(Node s)throws Exception{
		s.color=Node.GRAY;
		s.d=0;
		queue.enqueue(s);
		while(!queue.isEmpty()){
			Node u=queue.dequeue();
			Node v=u.next;
			Node prev=u;
			while(v!=null){
				if(v.color==Node.WHITE){
					v.color=Node.GRAY;
					v.d=prev.d+1;
					v.parent=prev;
					queue.enqueue(v);
				}
				prev=v;
				v=v.next;
			}
			
			u.color=Node.BLACK;
		}
	}
	public void printPath(Node s,Node v){
		if(v==s){
			System.out.print(s.id+"=>");
		}else if(v.parent==null){
			System.out.println();
			System.out.print(v.id+"=>");
		}else {
			printPath(s,v.parent);
			System.out.print(v.id+"=>");
		}
	}
	public void printAllPath(){
		System.out.println("path========");
		Node s=list[0];
		//for(int i=0;i<list.length;i++){
			Node node=s;//list[i];
			while(node.next!=null){
				printPath(s,node.next);
				System.out.println();
				node=node.next;
			}
		//}
	}
	public void print(){
		for(int i=0;i<list.length;i++){
			Node node=list[i];
			System.out.print(node.id+"=>");
			while(node.next!=null){
				System.out.print(node.next.id+"=>");
				node=node.next;
			}
			System.out.println();
		}
		
	}
	public static class Node{
		public static final int WHITE=1;
		public static final int BLACK=2;
		public static final int GRAY=3;
		private int id;
		private Node next;
		private int color=WHITE;
		private int d=Integer.MAX_VALUE;
		private Node parent;
	}
	public static void main(String[] args)throws Exception {
		Graphic g=new Graphic(5,30);
		g.print();
		g.broadFirstSearch();
		g.printAllPath();
		
		
	}

}

class NodeArrayQueue {
	private Graphic.Node []data;
	private int head;
	private int tail;
	private boolean full;
	public NodeArrayQueue(int size){
		data=new Graphic.Node[size];
		head=0;
		tail=0;
	}
	public void enqueue(Graphic.Node d)throws Exception{
		if(head-tail==0&&full||(head==0&&(tail==0)&&full)){
			throw new Exception("full");
		}
		data[tail]=d;
		tail=tail+1;
		if(tail==data.length){
			tail=0;
		}
		if(head==tail){
			full=true;
		}
		
	}
	
	public Graphic.Node dequeue()throws Exception{
		if(head==tail&&!full||(head==data.length&&tail==0)){
			throw new Exception("empty");
		}
		full=false;
		head=head+1;
		if(head==data.length){
			head=0;
			return data[data.length-1];
		}else{
			return data[head-1];
		}
		
	}
	
	public boolean isEmpty(){
		if(head==tail&&!full||(head==data.length&&tail==0)){
			return true;
		}else{
			return false;
		}
	}
	
}

bug修复

package com.data.struct;

import java.util.Random;

public class GraphicBroadFirst {
	private Node[] list;
	private NodeArrayQueue queue;

	public GraphicBroadFirst(int v, int e) {
		list = new Node[v];
		for (int i = 0; i < v; i++) {
			Node node = new Node();
			node.id = i;
			list[i] = node;
		}
		for (int i = 0; i < e; i++) {
			int v1 = new Random().nextInt(v);
			int v2 = new Random().nextInt(v);
			if (v1 == v2) {
				continue;
			}
			while (true) {
				Node node = list[v1];
				boolean already = false;
				while (node.next != null) {
					if (node.next.id == v2) {
						already = true;
						break;
					}
					node = node.next;
				}
				if (already == true) {
					break;
				}
				Node ex = new Node();
				ex.id = v2;
				node.next = ex;
				break;
			}
		}
		queue = new NodeArrayQueue((v * (v - 1) / 2) + 5);
	}

	public void broadFirstSearch() throws Exception {
		broadFirstSearch(list[0]);
	}

	public void broadFirstSearch(Node s) throws Exception {
		s.color = Node.GRAY;
		s.d = 0;
		queue.enqueue(s);
		while (!queue.isEmpty()) {
			Node u = queue.dequeue();
			Node v = u.next;
			Node prev = u;
			while (v != null) {
				if (list[v.id].color == Node.WHITE) {
					list[v.id].color = Node.GRAY;
					list[v.id].d = prev.d + 1;
					list[v.id].parent = prev;
					queue.enqueue(list[v.id]);
				}
				//prev = v;
				v = v.next;
			}

			u.color = Node.BLACK;
		}
	}

	public void printPath(Node s, Node v) {
		if (v == s) {
			System.out.print(s.id + "=>");
		} else if (v.parent == null) {
			System.out.println();
			System.out.print(v.id + "=>");
		} else {
			printPath(s, v.parent);
			System.out.print(v.id + "=>");
		}
	}

	public void printAllPath() {
		System.out.println("path========");
		Node s = list[0];
		// for(int i=0;i<list.length;i++){
		Node node = s;// list[i];
		for(int i=0;i<list.length;i++){
			printPath(list[0],list[i]);
			System.out.println();
		}
		/*while (node.next != null) {
			printPath(s, node.next);
			System.out.println();
			node = node.next;
		}*/
		// }
	}

	public void print() {
		for (int i = 0; i < list.length; i++) {
			Node node = list[i];
			System.out.print(node.id + "=>");
			while (node.next != null) {
				System.out.print(node.next.id + "=>");
				node = node.next;
			}
			System.out.println();
		}

	}

	public static class Node {
		public static final int WHITE = 1;
		public static final int BLACK = 2;
		public static final int GRAY = 3;
		private int id;
		private Node next;
		private int color = WHITE;
		private int d = Integer.MAX_VALUE;
		private Node parent;
	}

	public static void main(String[] args) throws Exception {
		GraphicBroadFirst g = new GraphicBroadFirst(5, 30);
		g.print();
		g.broadFirstSearch();
		g.printAllPath();

	}

}

class NodeArrayQueue {
	private GraphicBroadFirst.Node[] data;
	private int head;
	private int tail;
	private boolean full;

	public NodeArrayQueue(int size) {
		data = new GraphicBroadFirst.Node[size];
		head = 0;
		tail = 0;
	}

	public void enqueue(GraphicBroadFirst.Node d) throws Exception {
		if (head - tail == 0 && full || (head == 0 && (tail == 0) && full)) {
			throw new Exception("full");
		}
		data[tail] = d;
		tail = tail + 1;
		if (tail == data.length) {
			tail = 0;
		}
		if (head == tail) {
			full = true;
		}

	}

	public GraphicBroadFirst.Node dequeue() throws Exception {
		if (head == tail && !full || (head == data.length && tail == 0)) {
			throw new Exception("empty");
		}
		full = false;
		head = head + 1;
		if (head == data.length) {
			head = 0;
			return data[data.length - 1];
		} else {
			return data[head - 1];
		}

	}

	public boolean isEmpty() {
		if (head == tail && !full || (head == data.length && tail == 0)) {
			return true;
		} else {
			return false;
		}
	}

}


图的广度优先搜索BFS(C++) 这里对链表的结构进行了改编: /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ #include #include #i 阅读详情

相关推荐

算法7-6:图的遍历——广度优先搜索

广度优先搜索遍历类似于树的按层次遍历的过程。其过程为:假设从图中的某顶点v出发,在访问了v之后依次访问v的各个未曾被访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,直至图中所有已被访问的顶点的邻接点都被访问到。若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作为起始点。重复上述过程,直至图中所有顶点都被访问...

izhengtl2021的博客 2522

基于广度优先搜索的哈密顿图的判断算法

题目:哈密顿通路是指,在一个无向图中,存在一条经过图中每一个点,且仅经过一次的通路,若这条通路形成了闭合回路,则称这条回路为哈密顿回路,存在哈密顿回路的图称为哈密顿图。现给出无向图G的边,要求判断无向图G中是否存在哈密顿通路,且判断其是否为哈密顿图。   Input: 第一行为节点数n 第二行到倒数第二行为每一条边的信息,每行有两个数字,以空格分开,代表节点编号 最后一行为1-n以外的两...

庸才 3258

广度优先搜索BFS——图邻接表表示

BFS是图的另一个重要算法,下面是基于邻接表表示的BFS算法。 /* 图邻接表表示BFS input: 1 7 A 1 5 B 2 4 3 C 2 4 2 D 3 6 5 2 E 3 7 4 1 F 1 4 G 1 5 output: A E D G B F C */ #include #include #include using namespace std; struct LinkNode{

That 3196

20.基于图的广度优先搜索策略

#include<stdio.h> #include<stdlib.h> #define max 200 typedef struct data { int num; struct data *next; }data; typedef struct queue { struct data *head; struct data *rear; }qu...

杳杳_柒的博客 1236

图的遍历——广度优先搜索

在本题中,读入一个无向图的邻接矩阵(即数组表示),建立无向图并按照以上描述中的算法遍历所有顶点,输出遍历顶点的顺序。 【输入形式】 输入的第一行包含一个正整数n,表示图中共有n个顶点。其中n不超过50。 以后的n行中每行有n个用空格隔开的整数0或1,对于第i行的第j个0或1,1表示第i个顶点和第j个顶点有直接连接,0表示没有直接连接。当i和j相等的时候,保证对应的整数为0。 输入保证邻接矩阵为对称矩阵,即输入的图一定是无向图。 【输出形式】 只有一行,包含n个整数,表示按照题目描述中的广度优先遍历算法遍历整

AIGC 2096

实践指南——【SPSS操作解析】线性混合效应模型在重复测量数据中的应用

本文详细解析了线性混合效应模型在重复测量数据分析中的应用,并提供了SPSS操作指南。文章阐述了该模型如何通过区分固定效应与随机效应,有效处理数据非独立性和缺失值问题,从而获得更可靠的统计推断。

oo7890的博客 554

数据结构:图(广度优先搜索)

图与广度优先搜索

qingttqing的博客 1044

tcl脚本语言之file的常见用法

这些命令覆盖了从文件属性获取、修改、复制、删除、路径处理等广泛的文件操作需求。命令用于处理文件系统操作。

hzmscut的博客 5155

C广度优先搜索,图的遍历

10、广度优先搜索,图的遍历 1、 队列 (1)      定义     队列也是一种运算受限的线性表。在这种线性表上,插入限定在表的某一端进行,删除限定在表的另一端进行。允许插入的一端称为队尾,允许删除的一端称为队头。     特点:队列中数据元素的入队和出队过程是按照“先进先出” 的原则进行的。因此,队列又称为“先进先出”的线性表,简称FIFO表。 (2)      实现-

yzxCoder的博客 925

拯救者Y9000P 2022双系统实战:Ubuntu22.04分区优化与驱动避坑指南

本文提供联想拯救者Y9000P 2022款安装Ubuntu 22.04双系统的详细实战指南。重点讲解针对该机型的磁盘分区优化方案、NVIDIA显卡驱动安装避坑技巧,以及安装后的网络、时间同步等必备配置,帮助用户高效完成双系统部署并提升使用体验。

weixin_29208327的博客 425

2026年全国青少年信息素养大赛算法应用主题赛(C++赛项初赛模拟卷1及答案解析)

2026年全国青少年信息素养大赛算法应用主题赛(C++赛项初赛模拟卷1及答案解析)

王老师青少年编程 2028

图——深度优先搜索和广度优先搜索

目录图的深度优先搜索图的广度优先搜索 图的实现方式主要用到矩阵或链表,这里用的矩阵; 图的深度优先搜索就是一条路径一条路径的往完了走,需要用到栈;而广度优先搜索就是一层一层的搜索,需要用到队列; 这个是两种遍历方式都会用到的表示图节点的代码: /** * @ClassName Node * @Description 图节点 * @Author lzq * @Date 2019/6/19 0...

中都 792

输入失调电压Vos你搞明白了吗

输入失调电压Vos与温度

HW-BASE的博客 2416

图的深度和广度优先搜索

深度优先搜索:1,先进后出(栈/递归) 2,标记,防止重复搜索 3,邻接点(邻接矩阵)广度优先搜索:1)先进先出,2)标记,防止重复搜索 3)邻接点(邻接矩阵)int vis1[7];//标记,防止重复搜索。s.push(0);index:状态 dep:阶段。

JM_Lz的博客 489

Keil uVision5 STM32 startup_stm32f10x_md_vl.s error A3906U Malformed via file target not created..

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 2783

但是我如果真的用差速轮去控制转向 为了尽量原地旋转 转向角度精确 我应该怎么去配置左右两个轮子的速度呢

目标实现方式原地转向左右轮速度相等、方向相反精确角度用 IMU 检测 yaw 实时对齐停止判断达到目标 yaw ± 容差时立即停转控制方式状态机(idle → turning → done)推荐容差2°~3° (可根据实际调整)

qqqweiweiqq的博客 314

图的广度优先搜索(邻接表)

图的遍历(Traversing Graph)是指从图中某一顶点出发访问图中其余顶点,且使每个顶点仅被访问一次。 广度优先搜索(Breadth First Search)        广度优先搜索假设从图中某个顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后再分别从这些邻接点出发依次访问它们的邻接点,并使先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问(因此需要

CS练功房 7069

【GlobalMapper精品教程】038:模拟水位上升(洪水淹没分析)案例教程

基于数字高程模型 ( DEM )格网模型,实现给定水深情况下洪水淹没区的计算模型,讨论洪水淹没演进过程可视化实现的关键技术,以三维可视化方式,动态而形象地模拟在指定洪水水位下的洪水淹没演进过程。

智慧空间实验室 2885
上一篇: 微软100题-天天做-第38题
下一篇: 图的深度优先搜索
hxpjava1
博客等级 码龄19年 1365粉丝 511原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hxpjava1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值