当前位置: 首页 > news >正文

代码随想录算法训练营第四十八天

卡码网题目:

  • 108. 冗余的边
  • 109. 冗余的边II

其他:

今日总结
往期打卡


108. 冗余的边

跳转: 108. 冗余的边

学习: 代码随想录公开讲解

问题:

有一个图,它是一棵树,他是拥有 n 个节点(节点编号1到n)和 n - 1 条边的连通无环无向图,例如如图:
在这里插入图片描述
现在在这棵树上的基础上,添加一条边(依然是n个节点,但有n条边),使这个图变成了有环图,如图:
在这里插入图片描述
先请你找出冗余边,删除后,使该图可以重新变成一棵树。

思路:

题目保证只有一条冗余边,所以直接在join时判断就可以记录到无法加入的那条,然后直接输出即可.

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

代码:

import java.util.*;
class Main{private static int[] parent;private static int xn,yn;private static int find(int x){return x==parent[x]?x:(x=find(parent[x]));}private static boolean isSamed(int x,int y){int a = find(x);int b = find(y);return a==b;}private static void join(int x,int y){int a = find(x);int b = find(y);if(a==b){xn = x;yn = y;return;}parent[b] = parent[a];}public static void main(String[] args){Scanner sc = new Scanner(System.in);int n = sc.nextInt();parent = new int[n+1];for(int i=1;i<=n;i++){parent[i] = i;}for(int i=0;i<n;i++){int x = sc.nextInt();int y = sc.nextInt();join(x,y);}System.out.println(xn+" "+yn);}
}

109. 冗余的边II

跳转: 109. 冗余的边II

学习: 代码随想录公开讲解

问题:

有一种有向树,该树只有一个根节点,所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。有向树拥有 n 个节点和 n - 1 条边。如图:
在这里插入图片描述
现在有一个有向图,有向图是在有向树中的两个没有直接链接的节点中间添加一条有向边。如图:
在这里插入图片描述
输入一个有向图,该图由一个有着 n 个节点(节点编号 从 1 到 n),n 条边,请返回一条可以删除的边,使得删除该条边之后该有向图可以被当作一颗有向树。

思路:

这题也是一条冗边
但由于是有向边,不能简单的记录那个连接成环的边(因为要保证每个节点只能有一个父级且根节点没有父级)
这题需要记录所有的边,并记录入度,如果有入度为2的节点就不能简单删除,只能对那个入度为2的点的两条入边删除,而且并不是所有删除都合法,如果删除后剩下的节点依然有循环不构成一棵树,就是非法,需额外判断.
如果没有入度为2的点(说明连到了根节点上),则可以在冗余时直接删除即可
题目中说明要最后出现的一条边,所以需要注意去除边是从后到前(双端队列就是尾部开始),验环是从前到后(双端队列就是从头到尾,foreach遍历是从头到尾)

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

代码:

import java.util.*;
class Main{private static int[] parent;private static int n;private static void init(){for(int i=1;i<=n;i++){parent[i] = i;}}private static int find(int x){return x==parent[x]?x:(x=find(parent[x]));}private static boolean isSamed(int x,int y){int a = find(x);int b = find(y);return a==b;}private static void join(int x,int y){int a = find(x);int b = find(y);if(a==b) return;parent[b] = parent[a];}public static void main(String[] args){Scanner sc = new Scanner(System.in);Deque<int[]> stack = new LinkedList<>();n = sc.nextInt();int[] inDegree = new int[n+1];parent = new int[n+1];int target = -1;for(int i=0;i<n;i++){int x = sc.nextInt();int y = sc.nextInt();stack.add(new int[]{x,y});inDegree[y]++;if(inDegree[y]==2){target = y;}}if(target!=-1){for(int i=0;i<n;i++){int[] arr = stack.pollLast();if(arr[1]==target&&isTree(stack)){System.out.println(arr[0]+" "+arr[1]);return;}stack.addFirst(arr);}}getRemoveEdge(stack);}private static void getRemoveEdge(Collection<int[]> list) {init();for(int[] arr:list){if(isSamed(arr[0],arr[1])){System.out.println(arr[0]+" "+arr[1]);return;}join(arr[0],arr[1]);}}private static boolean isTree(Collection<int[]> list) {init();for(int[] arr:list){if(isSamed(arr[0],arr[1])) return false;join(arr[0],arr[1]);}return true;}
}

总结

练习了并查集找循环节点

往期打卡

代码随想录算法训练营第四十六&四十七天

代码随想录算法训练营第四十五天

代码随想录算法训练营第四十四天

代码随想录算法训练营第四十二&四十三天

代码随想录算法训练营第四十一天

代码随想录算法训练营第四十天

代码随想录算法训练营第三十九天

代码随想录算法训练营第三十八天

代码随想录算法训练营第三十七天

代码随想录算法训练营第三十五&三十六天

代码随想录算法训练营第三十四天

代码随想录算法训练营第三十三天(补)

代码随想录算法训练营第三十二天

代码随想录算法训练营第三十一天

代码随想录算法训练营第三十天(补)

代码随想录算法训练营第二十九天

代码随想录算法训练营第二十八天

代码随想录算法训练营第二十七天(补)

代码随想录算法训练营第二十六天

代码随想录算法训练营第二十五天

代码随想录算法训练营第二十四天

代码随想录算法训练营第二十三天

代码随想录算法训练营周末四

代码随想录算法训练营第二十二天(补)

代码随想录算法训练营第二十一天

代码随想录算法训练营第二十天

代码随想录算法训练营第十九天

代码随想录算法训练营第十八天

代码随想录算法训练营第十七天

代码随想录算法训练营周末三

代码随想录算法训练营第十六天

代码随想录算法训练营第十五天

代码随想录算法训练营第十四天

代码随想录算法训练营第十三天

代码随想录算法训练营第十二天

代码随想录算法训练营第十一天

代码随想录算法训练营周末二

代码随想录算法训练营第十天

代码随想录算法训练营第九天

代码随想录算法训练营第八天

代码随想录算法训练营第七天

代码随想录算法训练营第六天

代码随想录算法训练营第五天

代码随想录算法训练营周末一

代码随想录算法训练营第四天

代码随想录算法训练营第三天

代码随想录算法训练营第二天

代码随想录算法训练营第一天

相关文章:

  • Golang 之 Context 源码解析(1.20+)
  • 贪心算法套路模板+详细适用场景+经典题目清单
  • arcgis js统计FeatureLayer的椭球面积、平面面积
  • Python 实现基于 OpenAI API 的文章标题自动生成评论
  • 【深度学习-Day 16】梯度下降法 - 如何让模型自动变聪明?
  • 解锁C++递归算法:从原理到实战
  • 跟Gemini制作PPT:图标的搜索
  • 2025-05-19 代码人生 - 精选文章周刊
  • AI架构职责分配——支持AI模块的职责边界设计
  • Kettle的简单大概介绍
  • MFC——编程框架和基础
  • 【JVM 01-引言入门篇】
  • 西方世界的劫难Ⅲ:斯贝斯的诅咒支线攻略
  • C++:适配器
  • leetcode hot100:十四、解题思路大全:真·大全!
  • 【软件测试】第三章·软件测试基本方法(基于需求的测试方法)
  • 【Hexo】2.常用的几个命令
  • window 显示驱动开发-视频内存供应和回收(二)
  • 比特授权云外壳加密支持Android 15!
  • iOS 主要版本发布历史
  • 建设外包网站/注册google账号
  • 1688网站建设方案书模板/百度信息流怎么投放
  • 网站上怎么做动画广告视频下载/seo广告
  • 网站建设系/企业网站seo
  • h5商城网站建设是什么/如何自己制作网站
  • 信息网络设计/上海百度推广优化排名