java用广度优先的方法来判断有向图是否有环

本文介绍如何使用Java实现广度优先搜索(BFS)来判断有向图中是否存在环。作者在尝试解决一道笔试题时,通过广度优先遍历方法实现了基本功能,尽管遇到了困难,但仍然获得了成就感。
摘要由CSDN通过智能技术生成

这里的代码参考了很多别人的代码和文章。。

今天师兄做笔试题,我也跟着看,碰到了一个要构建有向图并判断节点是否有环的题。



另一位师兄说这个题可以用并查集做,并且做出来了,我用并查集试了试做不出来。。

我觉得这题大概是要用有向图做,考察有向图的构建及寻找有向环


但是我只会对着书本抄代码构建有向图,不会寻找环,就尝试了一下用前不久做爬虫用到的广度遍历来寻找有向环。。


import java.util.*;

public class test
{
	public static void main(String[] args)
	{
		UF uf = new UF();
		
		//构建有向图
		uf.AddDependency(1, 2);
		uf.AddDependency(2, 4);
		uf.AddDependency(4, 1);
		uf.AddDependency(1, 6);
		uf.AddDependency(6, 5);
		uf.AddDependency(5, 7);
		uf.AddDependency(4, 7);
		
		boolean isCycle;
		
		isCycle = uf.MouldelsCycularDependency(7);	//判断对应节点是否有环
				
		Sy
拓扑排序是一种算法,用于对有向无环图(DAG, Directed Acyclic Graph)的顶点进行线性排序,使得对于每条边u -> v,顶点u都在顶点v之前。如果图中有环,则无法进行有效的拓扑排序。下面是一个简单的Java代码示例,使用邻接表表示图,并利用深度优先搜索(DFS)辅助判断是否有环: ```java import java.util.*; class Node { int value; List<Node> neighbors; public Node(int value) { this.value = value; neighbors = new ArrayList<>(); } } public class TopSort { public static boolean hasCycle(Node[] nodes) { if (nodes == null || nodes.length == 0) return false; Set<Integer> visited = new HashSet<>(); for (Node node : nodes) { if (!dfs(node, visited)) return true; // 如果找到环,直接返回true } return false; // 所有节点都检查过,表示无环 } private static boolean dfs(Node node, Set<Integer> visited) { if (node == null) return true; // 非节点值视为已访问 if (visited.contains(node.value)) return false; // 已访问过的节点,有环 visited.add(node.value); for (Node neighbor : node.neighbors) { if (!dfs(neighbor, visited)) return false; // 对邻居递归调用 } return true; } public static void main(String[] args) { // 创建节点并连接边 Node n1 = new Node(1); Node n2 = new Node(2); Node n3 = new Node(3); n1.neighbors.add(n2); n2.neighbors.add(n3); // 判断是否有环 boolean hasCycleResult = hasCycle(new Node[]{n1, n2, n3}); System.out.println(hasCycleResult ? "图中有环" : "图中无环"); } } ``` 在这个例子中,`hasCycle`方法首先遍历所有节点,如果发现某个节点已经被访问过,说明存在环。如果没有找到这样的节点,那么整个图就是有向无环图。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值