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

图论篇--代码随想录算法训练营第五十六天打卡| 108. 冗余连接,109. 冗余连接II

108. 冗余连接

题目链接:108. 冗余连接

题目描述:

有一个图,它是一棵树,他是拥有 n 个节点(节点编号1到n)和 n - 1 条边的连通无环无向图(其实就是一个线形图),如图:

现在在这棵树上的基础上,添加一条边(依然是n个节点,但有n条边),使这个图变成了有环图,如图:

先请你找出冗余边,删除后,使该图可以重新变成一棵树。

解题思路:

并查集的直接应用

代码:

#include<iostream>
#include<vector>
using namespace std;const int N = 1010;
vector<int> father(N,0);void init(int n)
{for(int i = 1; i <= n; i++) father[i] = i;
}int find(int u)
{return u == father[u] ? u : father[u] = find(father[u]);
}bool isSame(int u, int t)
{if(find(u) == find(t)) return true;else return false;
}void join(int u, int s)
{u = find(u);s = find(s);if(u == s) return;father[s] = u;
}int main()
{int n = 0;cin >> n;init(n);pair<int,int> pii;for(int i = 0; i < n; i++){int u,s;cin >> u >> s;if(isSame(u,s)){cout << u << " " << s << endl;return 0;}else join(u,s);}return 0;
}

109. 冗余连接II

题目链接:109. 冗余连接II

题目描述:

有一种有向树,该树只有一个根节点,所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。有向树拥有 n 个节点和 n - 1 条边。如图: 

现在有一个有向图,有向图是在有向树中的两个没有直接链接的节点中间添加一条有向边。如图:

输入一个有向图,该图由一个有着 n 个节点(节点编号 从 1 到 n),n 条边,请返回一条可以删除的边,使得删除该条边之后该有向图可以被当作一颗有向树。

解题思路:

本题目要将一个有向图转变成为一颗有向树。知一个有向图=一颗有向树 + 一条有向边

有向树的特点是只有根节点入度为0,其他节点入度都为1。

  1. 情况一:如果我们找到入度为2的点,那么删一条指向该节点的边就行了。
  2. 情况二,对于某些入度为2的点,只能删特定的一条边,如下图所示。
  3. 情况三: 如果没有入度为2的点,说明 图中有环(注意是有向环)。

 

代码:

#include <iostream>
#include <vector>
using namespace std;
int n;
vector<int> father (1001, 0);
// 并查集初始化
void init() {for (int i = 1; i <= n; ++i) {father[i] = i;}
}
// 并查集里寻根的过程
int find(int u) {return u == father[u] ? u : father[u] = find(father[u]);
}
// 将v->u 这条边加入并查集
void join(int u, int v) {u = find(u);v = find(v);if (u == v) return ;father[v] = u;
}
// 判断 u 和 v是否找到同一个根
bool same(int u, int v) {u = find(u);v = find(v);return u == v;
}// 在有向图里找到删除的那条边,使其变成树
void getRemoveEdge(const vector<vector<int>>& edges) {init(); // 初始化并查集for (int i = 0; i < n; i++) { // 遍历所有的边if (same(edges[i][0], edges[i][1])) { // 构成有向环了,就是要删除的边cout << edges[i][0] << " " << edges[i][1];return;} else {join(edges[i][0], edges[i][1]);}}
}// 删一条边之后判断是不是树
bool isTreeAfterRemoveEdge(const vector<vector<int>>& edges, int deleteEdge) {init(); // 初始化并查集for (int i = 0; i < n; i++) {if (i == deleteEdge) continue;if (same(edges[i][0], edges[i][1])) { // 构成有向环了,一定不是树return false;}join(edges[i][0], edges[i][1]);}return true;
}int main() {int s, t;vector<vector<int>> edges;cin >> n;vector<int> inDegree(n + 1, 0); // 记录节点入度for (int i = 0; i < n; i++) {cin >> s >> t;inDegree[t]++;edges.push_back({s, t});}vector<int> vec; // 记录入度为2的边(如果有的话就两条边)// 找入度为2的节点所对应的边,注意要倒序,因为优先删除最后出现的一条边for (int i = n - 1; i >= 0; i--) {if (inDegree[edges[i][1]] == 2) {vec.push_back(i);}}// 情况一、情况二if (vec.size() > 0) {// 放在vec里的边已经按照倒叙放的,所以这里就优先删vec[0]这条边if (isTreeAfterRemoveEdge(edges, vec[0])) {cout << edges[vec[0]][0] << " " << edges[vec[0]][1];} else {cout << edges[vec[1]][0] << " " << edges[vec[1]][1];}return 0;}// 处理情况三// 明确没有入度为2的情况,那么一定有有向环,找到构成环的边返回就可以了getRemoveEdge(edges);
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • PHP一键约课高效健身智能健身管理系统小程序源码
  • 线性规划及其MATLAB实现
  • Java发邮件:如何配置SMTP服务器实现发信?
  • 免费且实用:UI设计常用的颜色参考网站和一些Icon设计网站
  • jmeter之setUP、tearDown线程组
  • 用于大数据分析的数据存储格式:Parquet、Avro 和 ORC 的性能和成本影响
  • 【C++ Primer Plus习题】15.4
  • INIC6081量产工具下载,initio6081开卡软件分享
  • 机器线程数量突然激增的原因是什么?
  • 【网络】高级IO——五种IO模式
  • STM32G070 CubeMX配置多通道/单通道ADC+DMA流程 LL库
  • 本地部署大语言模型详细操作步骤
  • 【项目开发 | Python】基于“羊了个羊“风格的消除类小游戏
  • 计算机操作系统之并行性与并发性笔记
  • NumPy 线性代数
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • classpath对获取配置文件的影响
  • Fabric架构演变之路
  • Git的一些常用操作
  • laravel with 查询列表限制条数
  • Markdown 语法简单说明
  • PaddlePaddle-GitHub的正确打开姿势
  • windows下mongoDB的环境配置
  • 浮现式设计
  • 解析 Webpack中import、require、按需加载的执行过程
  • 前端技术周刊 2019-01-14:客户端存储
  • 删除表内多余的重复数据
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 云大使推广中的常见热门问题
  • 正则学习笔记
  • 阿里云API、SDK和CLI应用实践方案
  • 阿里云服务器如何修改远程端口?
  • ​低代码平台的核心价值与优势
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (第61天)多租户架构(CDB/PDB)
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (五十)第 7 章 图(有向图的十字链表存储)
  • (转)Oracle存储过程编写经验和优化措施
  • (转)原始图像数据和PDF中的图像数据
  • .FileZilla的使用和主动模式被动模式介绍
  • .Net CF下精确的计时器
  • .NET 某和OA办公系统全局绕过漏洞分析
  • .net网站发布-允许更新此预编译站点
  • @DataRedisTest测试redis从未如此丝滑
  • @Repository 注解
  • []T 还是 []*T, 这是一个问题
  • [<死锁专题>]
  • [Angular] 笔记 21:@ViewChild