day54 图论章节刷题Part06(108.冗余连接、109.冗余连接II)

108.冗余连接

思路:从前向后遍历每一条边,边的两个节点如果不在同一个集合,就加入集合;如果边的两个节点已经出现在同一个集合里,说明边的两个节点已经连在一起了,再加入这条边一定会出现环。

代码如下:

import java.util.*;
public class Main{public static void main (String[] args) {Scanner scan=new Scanner(System.in);int n=scan.nextInt();DisJoint disJoint=new DisJoint(n+2);for(int i=0;i<n;i++){int u=scan.nextInt();int v=scan.nextInt();if(!disJoint.isSame(u,v)) disJoint.join(u,v);else System.out.println(u+" "+v);}}}class DisJoint{private int[] father;public DisJoint(int N){father=new int[N];for(int i=0;i<N;i++){father[i]=i;}}public int find(int n){return father[n]==n?n: (father[n]=find(father[n]));}public boolean isSame(int u,int v){u=find(u);v=find(v);return u==v;}public void join(int u,int v){u=find(u);v=find(v);if(u==v) return;father[v]=u;}
}

109.冗余连接II

有向图比无向图相对复杂,考虑多种情况:

  • 情况一:如果找到入度为2的点,需要判断删除哪一条边,删除后本图能成为有向树。如果是删哪个都可以,优先删顺序靠后的边。
  • 情况二: 如果没有入度为2的点,说明图中有环,删掉构成环的边。

代码如下:

import java.util.*;
public class Main{public static void main (String[] args) {Scanner scan=new Scanner(System.in);int n=scan.nextInt();List<int[]> edge=new ArrayList<>();int[] inDegree=new int[n+1];DisJoint disJoint=new DisJoint(n+1);List<int[]> possibleEdges = new ArrayList<>();for (int i = 0; i < n; i++) {int s = scan.nextInt();int t = scan.nextInt();edge.add(new int[]{s, t});inDegree[t]++;if (!disJoint.isSame(s,t)) {disJoint.join(s,t);}else possibleEdges.add(new int[]{s, t});}// 寻找入度为2的节点int conflictNode = -1;for (int i = 1; i <= n; i++) {if (inDegree[i] == 2) {conflictNode = i;break;}}// 如果存在入度为2的节点,逆向查找多余的边if (conflictNode != -1) {for (int i = n - 1; i >= 0; i--) {if (edge.get(i)[1] == conflictNode) {// 尝试删除这条边,检查是否还能构成有向树if (checkTree(edge, i)) {System.out.println(edge.get(i)[0] + " " + edge.get(i)[1]);return;}}}}// 如果存在可能的边,选择最后出现的那条边if (!possibleEdges.isEmpty()) {int[] lastEdge = possibleEdges.get(possibleEdges.size() - 1);System.out.println(lastEdge[0] + " " + lastEdge[1]);}}// 检查删除某条边后是否还能构成有向树private static boolean checkTree(List<int[]> edge, int removeIndex) {int n = edge.size();DisJoint disJoint = new DisJoint(n + 1);Set<Integer> nodes = new HashSet<>();for (int i = 0; i < n; i++) {if (i == removeIndex) continue;int s = edge.get(i)[0];int t = edge.get(i)[1];nodes.add(s);nodes.add(t);if (disJoint.isSame(s, t)) {return false; // 形成环} else {disJoint.join(s, t);}}// 检查是否所有节点都在同一个连通分量中for (int i = 1; i <= n; i++) {if (nodes.contains(i) && !disJoint.isSame(1, i)) {return false; // 不是连通的}}return true;}
}
class DisJoint{private int[] father;public DisJoint(int N){father=new int[N];for(int i=0;i<N;i++){father[i]=i;}}public int find(int n){return father[n]==n?n: (father[n]=find(father[n]));}public boolean isSame(int u,int v){u=find(u);v=find(v);return u==v;}public void join(int u,int v){u=find(u);v=find(v);if(u==v) return;father[v]=u;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/59706.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Request 和 Response 万字详解

文章目录 1.Request和Response的概述2.Request对象2.1 Request 继承体系2.2 Request获取请求数据2.2.1 获取请求行数据2.2.2 获取请求头数据2.2.3 获取请求体数据2.2.4 获取请求参数的通用方式 2.3 解决post请求乱码问题 掌握内容讲解内容小结 2.4 Request请求转发 3.HTTP响应详…

经典网络模型

文章目录 网络演变过程1、阻塞IO&#xff08;BIO&#xff09;实现缺点 2、非阻塞IO&#xff08;NIO&#xff09;实现改进后设置非阻塞IO缺点 3、IO多路复用第一版&#xff08;select/poll&#xff09;问题点改进缺点 4、IO多路复用第二版&#xff08;epoll&#xff09;5、信号驱…

从神经元到神经网络:深度学习的进化之旅

神经元、神经网络 神经元 Neuron )&#xff0c;又名感知机( Perceptron )&#xff0c;在模型结构上与 逻辑回归 一致&#xff0c;这里以一个二维输入量的例子对其进行进一步 的解释&#xff1a; 假设模型的输 入向 量是一 维特征向 (x1,x2). 则单神 经元的模型结构 如下…

面试题:Spring(一)

1. Spring框架中bean是单例么&#xff1f; Service Scope("singleton") public class UserServiceImpl implements UserService { }singleton : bean在每个Spring IOC容器中只有一个实例。prototype&#xff1a;一个bean的定义可以有多个实例。 2. Spring框架中的…

qt QFileSystemModel详解

1、概述 QFileSystemModel是Qt框架中的一个关键类&#xff0c;它继承自QAbstractItemModel&#xff0c;专门用于在Qt应用程序中展示文件系统的数据。这个模型提供了一个方便的接口&#xff0c;使得开发者可以轻松地在应用程序中集成文件和目录的树形结构&#xff0c;并通过视图…

从0开始深度学习(26)——汇聚层/池化层

池化层通过减少特征图的尺寸来降低计算量和参数数量&#xff0c;同时增加模型的平移不变性和鲁棒性。汇聚层的主要优点之一是减轻卷积层对位置的过度敏感。 1 最大汇聚层、平均汇聚层 汇聚层和卷积核一样&#xff0c;是在输入图片上进行滑动计算&#xff0c;但是不同于卷积层的…

右旋圆极化散射后的stocks矢量 与T3矩阵的关系

T3矩阵如下 斯托克斯与T3的关系如下。 斯托克斯与T3均没有平均处理&#xff0c;即斯托克斯是完全极化波的&#xff08;一种琼斯矢量得到&#xff09;&#xff0c;T3是由一个散射矩阵得到&#xff0c;只有一个特征值。

Java的枚举(详细)

枚举&#xff08;enum&#xff09;是Java中的一种特殊类型&#xff0c;用于定义一组常量。枚举类型可以提高代码的可读性和可维护性&#xff0c;使得常量的使用更加清晰和安全。以下是关于枚举的详细介绍&#xff1a; ENUM的源码 package java.lang; ​ import java.io.Serial…

蓝桥杯顺子日期(填空题)

题目&#xff1a;小明特别喜欢顺子。顺子指的就是连续的三个数字&#xff1a;123、456 等。顺子日期指的就是在日期的 yyyymmdd 表示法中&#xff0c;存在任意连续的三位数是一个顺子的日期。例如 20220123 就是一个顺子日期&#xff0c;因为它出现了一个顺子&#xff1a;123&a…

支持 Mermaid 语言预览,用通义灵码画流程图

想像看图片一样快速读复杂代码和架构&#xff1f;通义灵码上新功能&#xff1a;智能问答支持 Mermaid 语言的预览模式&#xff0c;即支持代码逻辑可视化&#xff0c;可以把每段代码画成流程图&#xff0c;像脑图工具一样画出代码逻辑和框架。 操作步骤&#xff1a;选中代码块&a…

promise的用法以及注意事项,看了这篇你就会了

一&#xff0c;为什么要使用promise,ta能解决那些问题&#xff1f; Promise 是异步编程的一种解决方案&#xff1a; 从语法上讲&#xff0c;Promise是一个对象&#xff0c;从它可以获取异步操作的消息&#xff1b;从本意上讲&#xff0c;它是承诺&#xff0c;承诺它过一段时间…

DRAM有驱动吗?/usr/bin/cpp是C++相关的程序吗?BIOS到底是什么?

DRAM有驱动吗? 一般而言&#xff0c;以DRAM提供R/W操作的角度&#xff0c;DRAM不存在内核级驱动&#xff0c;因为各硬件访问DRAM都是通过硬件PATH&#xff0c;不需要软件驱动干预&#xff0c;这与一般所说的驱动程序不同&#xff0c;那些驱动程序大多是协调上层应用或内核程式…

汉明重量汉明距离译码与纠错

目录 汉明重量汉明距离汉明重量与校验矩阵的关系错误图样&最小距离译码规则检错纠错能力与最小汉明重量 汉明重量 定义14 设 G G G 不是零矩阵&#xff0c;则称非零码字中非零元的数量为该码字的汉明重。一个编码中所有非零码字的汉明重的最小值称为 G G G的最小汉明重。 …

【Unity】Unity拖拽在Android设备有延迟和卡顿问题的解决

一、介绍 在制作Block类游戏时&#xff0c;其核心的逻辑就是拖拽方块放入到地图中&#xff0c;这里最先想到的就是Unity的拖拽接口IDragHandler,然后通过 IPointerDownHandler, IPointerUpHandler 这两个接口判断按下和松手&#xff0c;具体的实现逻辑就是下面 public void On…

解线性方程组(二)

实验类型&#xff1a;●验证性实验 ○综合性实验 ○设计性实验 实验目的&#xff1a;进一步熟练掌握用Jacobi迭代法和Gauss-Seidel法解线性方程组的算法&#xff0c;提高编程能力和解算线性方程组问题的实践技能。 实验内容&#xff1a; 1)取初值性x(0)(0,0,0,0)T, 精度要求ε…

易语言模拟真人动态生成鼠标滑动路径

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…

python语言基础-4 常用模块-4.2 time模块

声明&#xff1a;本内容非盈利性质&#xff0c;也不支持任何组织或个人将其用作盈利用途。本内容来源于参考书或网站&#xff0c;会尽量附上原文链接&#xff0c;并鼓励大家看原文。侵删。 4.2 time模块 python中提供了处理时间的标准库time。利用time库可以获取时间、进行时…

Charles抓包_Android

1.下载地址 2.破解方法 3.安卓调试办法 查看官方文档&#xff0c;Android N之后抓包要声明App可用User目录下的CA证书 3.1.在Proxy下进行以下设置&#xff08;路径Proxy->Proxy Settings&#xff09; 3.1.1.不抓包Windows&#xff0c;即不勾选此项&#xff0c;免得打输出不…

进程崩溃难以定位,日志分析五步搞定|OceanBase故障排查实践

作者&#xff1a;胡呈清&#xff0c;爱可生 DBA 团队成员&#xff0c;擅长故障分析、性能优化。 背景 Server 进程崩溃的常见原因包括程序bug、文件损坏、磁盘坏块以及内存坏块&#xff0c;这类故障通常较难分析和定位。 在OceanBase 集群部署时&#xff0c;系统会自动配置co…