Code Practice Journal | Day 56_Graph06

2024-08-29 00:12

本文主要是介绍Code Practice Journal | Day 56_Graph06,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

KamaCoder 107. 寻找存在的路径

题目:107. 寻找存在的路径 (kamacoder.com)
题解:代码随想录 (programmercarl.com)

solution
class Program
{public static void Main(string[] args){string[] dimensions = Console.ReadLine().Split();int n = int.Parse(dimensions[0]);int m = int.Parse(dimensions[1]);DSU dsu = new DSU(n);for (int i = 0; i < m; i++){string[] nums = Console.ReadLine().Split();int x = int.Parse(nums[0]) - 1;int y = int.Parse(nums[1]) - 1;dsu.union(x, y);}string[] nodes = Console.ReadLine().Split();Console.WriteLine(dsu.find(int.Parse(nodes[0]) - 1) == dsu.find(int.Parse(nodes[1]) - 1) ? 1 : 0);}
}class DSU
{int[] dsu;public DSU(int size){dsu= new int[size];for (int i = 0; i < size; i++){dns[i] = i;}}public int find(int num){if (dsu[num] != num){dsu[num] = find(dsu[num]);}return dsu[num];}public void union(int x, int y){int rootx = find(x);int rooty = find(y);if (rootx != rooty){dsu[rootx] = y;}}
}

KamaCoder 108. 冗余连接

题目:108. 冗余连接 (kamacoder.com)
题解:代码随想录 (programmercarl.com)

solution
class Program
{public static void Main(string[] args){int num1 = 0;int num2 = 0;string N = Console.ReadLine();int n = int.Parse(N);DSU dsu = new DSU(n);for (int i = 0; i < n; i++){string[] nums = Console.ReadLine().Split();int x = int.Parse(nums[0]) - 1;int y = int.Parse(nums[1]) - 1;if (dsu.union(x, y)){num1 = x;num2 = y;}}Console.WriteLine(string.Join(" ", num1 + 1, num2 + 1));}
}class DSU
{int[] dsu;public DSU(int size){dsu = new int[size];for (int i = 0; i < size; i++){dsu[i] = i;}}public int find(int num){if (dsu[num] != num){dsu[num] = find(dsu[num]);}return dsu[num];}public bool union(int x, int y){int rootx = find(x);int rooty = find(y);if (rootx != rooty){dsu[rootx] = y;return false;}else return true;}
}
summary

key:

(成环)删除的边:构成边的两个节点具有相同的根

改造union函数:遇到需要删除的边则记录节点,否则将边加入并查集

KamaCoder 107. 冗余连接Ⅱ

题目:109. 冗余连接II (kamacoder.com)
题解:代码随想录 (programmercarl.com)

solution
class Program
{public static void Main(string[] args){//处理输入//  维度string N = Console.ReadLine();int n = int.Parse(N);// 数组int[][] edges = new int[n + 1][];for (int i = 1; i <= n; i++){string[] nodes = Console.ReadLine().Split();edges[i][0] = int.Parse(nodes[0]);edges[i][1] = int.Parse(nodes[1]);}//初始化// 可能的双父节点int[] candi1 = null;int[] candi2 = null;// dsu数组DSU dsu = new DSU(n + 1);//检查双父节点并拆分foreach (int[] edge in edges){int parent = edge[0];int child = edge[1];if (dsu.dsu[child] != child){// 原边candi1 = new int[] { dsu.dsu[child], child };// 新边candi2 = new int[] { parent, child };// 拆分edge[1] = 0;}else{dsu.dsu[child] = parent;}}//检查环// 重新初始化for (int i = 0; i <= n; i++){dsu.dsu[i] = i;}foreach (int[] edge in edges){if (edge[1] == 0) continue;int parent = edge[0];int child = edge[1];if (!dsu.union(parent, child)){if (candi1 == null){Console.WriteLine($"{parent} {child}");}else{Console.WriteLine($"{candi1[0]} {candi2[1]}");}return;}}Console.WriteLine($"{candi2[0]} {candi2[1]}");}
}public class DSU
{public int[] dsu;public DSU(int size){dsu = new int[size];for (int i = 0; i < size; i++){dsu[i] = i;}}public int find(int num){if (dsu[num] != num){dsu[num] = find(dsu[num]);}return dsu[num];}public bool union(int x, int y){int rootx = find(x);int rooty = find(y);if (rootx == rooty) return false;else{dsu[y] = x;return true;}}
}
summary

两种冗余情况:

1、一个节点存在两个父节点

2、存在环

清除冗余策略:

1、记录每个节点的父节点,如果存在则分别记录两条边

2、使用并查集检测环

3、判断情况:
若不存在双父节点:直接处理环
若存在双父节点:分别尝试删除两条边

这篇关于Code Practice Journal | Day 56_Graph06的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1116284

相关文章

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

Linux基础入门 --9 DAY

文本处理工具之神vim         vi和vim简介 一、vi编辑器 vi是Unix及类Unix系统(如Linux)下最基本的文本编辑器,全称为“visual interface”,即视觉界面。尽管其名称中包含“visual”,但vi编辑器实际上工作在字符模式下,并不提供图形界面。vi编辑器以其强大的功能和灵活性著称,是Linux系统中不可或缺的工具之一。 vi编辑器具有三种主要的工作模

day-50 求出最长好子序列 I

思路 二维dp,dp[i][h]表示nums[i] 结尾,且有不超过 h 个下标满足条件的最长好子序列的长度(0<=h<=k),二维数组dp初始值全为1 解题过程 状态转换方程: 1.nums[i]==nums[j],dp[i,h]=Math.max(dp[i,h],dp[j,h]+1) 2.nums[i]!=nums[j],dp[i,h]=Math.max(dp[i,h],dp[j,h-1

Debugging Lua Project created in Cocos Code IDE creates “Waiting for debugger to connect” in Win-7

转自 I Installed Cocos Code IDE and created a new Lua Project. When Debugging the Project(F11) the game window pops up and gives me the message waiting for debugger to connect and then freezes. Also a

[Day 73] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

AI在健康管理中的應用實例 1. 引言 隨著健康管理需求的提升,人工智能(AI)在該領域的應用越來越普遍。AI可以幫助醫療機構提升效率、精準診斷疾病、個性化治療方案,以及進行健康數據分析,從而改善病患的健康狀況。這篇文章將探討AI如何應用於健康管理,並通過具體代碼示例說明其技術實現。 2. AI在健康管理中的主要應用場景 個性化健康建議:通過分析用戶的健康數據,如飲食、運動、睡眠等,AI可

Vue day-03

目录 Vue常用特性 一.响应更新 1. 1 v-for更新监测 1.2 v-for就地更新 1.3 什么是虚拟DOM 1.4 diff算法更新虚拟DOM 总结:key值的作用和注意点: 二.过滤器 2.1 vue过滤器-定义使用 2.2 vue过滤器-传参和多过滤器 三. 计算属性(computed) 3.1 计算属性-定义使用 3.2 计算属性-缓存 3.3 计算属

用Python实现时间序列模型实战——Day 14: 向量自回归模型 (VAR) 与向量误差修正模型 (VECM)

一、学习内容 1. 向量自回归模型 (VAR) 的基本概念与应用 向量自回归模型 (VAR) 是多元时间序列分析中的一种模型,用于捕捉多个变量之间的相互依赖关系。与单变量自回归模型不同,VAR 模型将多个时间序列作为向量输入,同时对这些变量进行回归分析。 VAR 模型的一般形式为: 其中: ​ 是时间  的变量向量。 是常数向量。​ 是每个时间滞后的回归系数矩阵。​ 是误差项向量,假

LLVM入门2:如何基于自己的代码生成IR-LLVM IR code generation实例介绍

概述 本节将通过一个简单的例子来介绍如何生成llvm IR,以Kaleidoscope IR中的例子为例,我们基于LLVM接口构建一个简单的编译器,实现简单的语句解析并转化为LLVM IR,生成对应的LLVM IR部分,代码如下,文件名为toy.cpp,先给出代码,后面会详细介绍每一步分代码: #include "llvm/ADT/APFloat.h"#include "llvm/ADT/S

VS Code 调试go程序的相关配置说明

用 VS code 调试Go程序需要在.vscode/launch.json文件中增加如下配置:  // launch.json{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information,

Linux日志-journal日志

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux 系统中的日志是记录系统活动和事件的重要工具,它们可以帮助管理员监视系统状态、调查问题以及了解系统运行状况。主要涉及到系统日志,登录日志,定时任务日志,监控日志,崩溃日志,二进制日志等内容,这些日志都存储在/var/log目录下,有的日志文本格式,可以直接使用