day56 第十一章:图论part06

ops/2025/2/22 21:44:37/

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/ops/160610.html

相关文章

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

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

解锁D3.js与PlantUML的交互奥秘:探索知识图谱数据可视化新领域

解锁D3.js与PlantUML的交互魔法&#xff1a;数据可视化新征程 在前端开发的广袤天地里&#xff0c;数据可视化一直是一颗璀璨的明珠&#xff0c;吸引着无数开发者探索其奥秘。而当D3.js这一强大的JavaScript库&#xff0c;遇上专注于创建UML图的PlantUML&#xff0c;一场奇妙的…

《晶体管电路设计》 第三章 增强输出的电路

一起阅读《晶体管电路设计》系列文章目录 第一章 概述 第二章 放大电路的工作&#xff08;一&#xff09; 第二章 放大电路的工作&#xff08;二&#xff09; 第三章 增强输出的电路 文章目录 一起阅读《晶体管电路设计》系列文章目录前言一、射极跟随器的波形二、电路设计三、…

利用AI优化可再生能源管理:Python让绿色能源更高效

利用AI优化可再生能源管理&#xff1a;Python让绿色能源更高效 引言 在全球气候变化和能源危机的背景下&#xff0c;可再生能源的利用变得尤为重要。然而&#xff0c;可再生能源的管理和优化面临诸多挑战&#xff0c;如能源生产的不稳定性和能源需求的波动性。幸运的是&#…

蓝桥杯15 填空题

1.握手问题&#xff1a; 思路&#xff1a;首先当所有人都握过手&#xff0c;由于一次握手相当于两个人都握手过&#xff0c;所以容易发现这是一个组合问题&#xff0c;为&#xff08;50*49&#xff09;/2&#xff0c;而其中有7个人没有相互握过手&#xff0c;那么减去&#xff…

Node.js中不支持require和import两种导入模块的混用

最近在整理Node.js相关的知识点&#xff0c;发现通过Node.js支持的两个模块导入语句require和import在同时使用时会发生错误&#xff0c;而且错误非常诡异。 例如&#xff0c;在先使用require导入模块&#xff0c;在使用import导入模块时&#xff0c;出现require无法识别&#…

第1章 快速认识线程

1.1 线程的介绍 对于计算机来说每一个任务就是一个进程Process&#xff0c;在每一个进程内部至少要有一个线程Thread是在运行中的。 1.2 快速创建并启动一个线程 1.2.1 尝试并行运行 package chapter01; import java.util.concurrent.TimeUnit; public class TryConcurrenc…

开题报告——基于Spring Boot的社区居民健康管理平台的设计与实现

关于本科毕业设计(论文)开题报告的规定 为切实做好本科毕业设计(论文)的开题报告工作,保证论文质量,特作如下规定: 一、开题报告是本科毕业设计(论文)的必经过程,所有本科生在写作毕业设计(论文)之前都必须作开题报告。 二、开题报告主要检验学生对专业知识的驾…