day56 第十一章:图论part06

embedded/2025/2/24 8:50:07/

108.冗余连接

注意init初始化

改进:

其实只有一条边冗余,改为,如果两条边在同一个集合里,就输出,不然加入。

#include <iostream>
#include <vector>
using namespace std;int n = 1005;
vector<int> father(n,0);void init(){for (int i=0;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 v){u = find(u);v =  find(v);return u == v;
}void join(int u, int v){u = find(u);v = find(v);if(u==v){return;}father[u] = v;
}int main(){int N;cin >>N;init(); //1111int s,t,redun_s, redun_t;bool result;while(N--){cin>>s>>t;result = isSame(s,t);if (result){redun_s = s;redun_t = t;}join(s,t);}cout << redun_s <<" "<< redun_t << endl;return 0;
}

109.冗余连接II

不好做:

1.入度为2:看删哪条边可以形成树,而不是环(因为只有两种可能,一个树,一个环)

2.没有入度为2的点:有向环,删最后形成环的那条

#include <iostream>
#include <vector>
using namespace std;int n;
vector<int> father(1001, 0);void init() {for (int i = 0; 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 v) {u = find(u);v = find(v);return u == v;
}void join(int u, int v) {u = find(u);v = find(v);if (u == v) {return;}father[v] = u;
}bool isTreeAfterRemoveVec(const vector<vector<int>>& edges, int v) {init();for (int i = 0; i < n; i++) {if (i == v) {continue;}if (isSame(edges[i][0], edges[i][1])) {return false;}join(edges[i][0], edges[i][1]);}return true;
}void getRemoveEdge(const vector<vector<int>>& edges) {init();for (int i = 0; i < n; i++) {if (isSame(edges[i][0], edges[i][1])) {cout << edges[i][0] << " " << edges[i][1];return;}join(edges[i][0], edges[i][1]);}
}int main() {// int N;cin >> n;// init(); //1111// n = 3;// vector<vector<int>> grid;// grid = {//     {1,2},//     {1,3},//     {2,3}// };vector<vector<int>> edges;vector<int> degrees(n+1, 0);int s, t;for(int i=0;i<n;i++) {cin >> s >> t;// s = grid[i][0];// t = grid[i][1];edges.push_back({ s,t });degrees[t]++;}//计算入度vector<int> vec;for (int i = 0; i < n; i++) {//cout << degrees[edges[i][1]] << " ";if (degrees[edges[i][1]] == 2) {vec.push_back(i);}}//情况1:入度为2,看删哪个if (vec.size() > 1) {if (isTreeAfterRemoveVec(edges, vec[1])) {cout << edges[vec[1]][0] << " " << edges[vec[1]][1] << endl;}else {cout << edges[vec[0]][0] << " " << edges[vec[0]][1] << endl;}return 0;}//情况2:有向环getRemoveEdge(edges);return 0;
}


http://www.ppmy.cn/embedded/164796.html

相关文章

DeepSeek写俄罗斯方块手机小游戏

DeepSeek写俄罗斯方块手机小游戏 提问 根据提的要求&#xff0c;让DeepSeek整理的需求&#xff0c;进行提问&#xff0c;内容如下&#xff1a; 请生成一个包含以下功能的可运行移动端俄罗斯方块H5文件&#xff1a; 核心功能要求 原生JavaScript实现&#xff0c;适配手机屏幕 …

在windows下安装windows+Ubuntu16.04双系统(下)

这篇文章的内容主要来源于这篇文章&#xff0c;为正式安装windowsUbuntu16.04双系统部分。在正式安装前&#xff0c;若还没有进行前期准备工作&#xff08;1.分区2.制作启动u盘&#xff09;&#xff0c;见《在windows下安装windowsUbuntu16.04双系统(上)》 二、正式安装Ubuntu …

C++ 模板初阶

目录 一、前言 二、正文 1、函数模板 1.1函数模板概念 1.2函数模板格式 1.3函数模板的原理 1.4函数模板的实例化 1.5模板参数的匹配原则 2.类模板 2.1类模板的定义格式 2.2类模板函数化 3.template与typedef的区别 三、结言 一、前言 据说C创建初期&#xff0c;…

go 查看版本

个人学习笔记 1. 打开终端&#xff08;或命令提示符&#xff09; 在 Windows 上&#xff0c;使用 cmd 或 PowerShell。在 macOS 或 Linux 上&#xff0c;使用终端应用程序。 2. 运行以下命令 go version 3. 查看输出 命令执行后&#xff0c;终端会显示已安装的 Go 版本&…

Python pip 缓存清理:全面方法与操作指南

在使用 Python 的 pip 进行包安装时&#xff0c;pip 会将下载的包缓存起来&#xff0c;以加快后续相同包的安装速度。不过&#xff0c;随着时间推移&#xff0c;缓存会占用大量磁盘空间&#xff0c;这时你可以对其进行清理。下面为你介绍不同操作系统下清理 pip 缓存的方法。 …

AI发展迅速,是否还有学习前端的必要性?

今天有个小伙伴跟我讨论&#xff1a;“现在 AI 发展迅速&#xff0c;是否还有学习 JS 或者 TS 及前端知识的必要&#xff1f;” 我非常肯定地说&#xff1a; 是的&#xff0c;学习 JavaScript/TypeScript 以及前端知识仍然非常必要&#xff0c;而且在可预见的未来&#xff0c;…

玩转 Java 与 Python 交互,JEP 库来助力

文章目录 玩转 Java 与 Python 交互&#xff0c;JEP 库来助力一、背景介绍二、JEP 库是什么&#xff1f;三、如何安装 JEP 库&#xff1f;四、JEP 库的简单使用方法五、JEP 库的实际应用场景场景 1&#xff1a;数据处理场景 2&#xff1a;机器学习场景 3&#xff1a;科学计算场…

基于计算机视觉的手势识别:让机器理解我们的手势语言

友友们好! 我的新专栏《Python进阶》正式启动啦!这是一个专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会找到: ● 深入解析:每一篇文章都将…