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

代码随想录算法训练营第五十六天|动态规划part6

108.冗余连接

题目链接:108. 冗余的边

文章讲解:代码随想录

思路:

题意隐含

只有一个冗余边

#include <iostream>
#include <vector>
using namespace std;
int n=1001;
vector<int>father(n,0);void init(){for(int i=0;i<n;i++){father[i]=i;}
}
int find(int x){if(father[x]==x)  return x;else return father[x]=find(father[x]);
}void join(int u, int v){u=find(u);v=find(v);if(u==v) return;father[v]=u;
}bool isSame(int u,int v){u=find(u);v=find(v);return u==v;
}int main(){int n;cin>>n;init();for(int i=0;i<n;i++){int s,t;cin>>s>>t;if(isSame(s,t)){   //s跟t是否连同 已经连通的话说明当前边冗余cout<<s<<' '<<t<<endl;return 0;}else{join(s,t);    }}
}

 

109.冗余连接II

题目链接:109. 冗余的边II

文章讲解:代码随想录

根据边的入度来考虑

情况1: 存在入度为2的节点
说明这个节点存在冗余的边(存在两个父节点)

此处需要判断删除哪条边 

情况2:不存在入度为2的节点 此时存在环对于存在环

应该找出哪条边使得构成环    可以通过并查集来找

#include <iostream>
#include <vector>
using namespace std;int n=1001;
vector<int>father(n,0);
void init(){for(int i=0;i<n;i++){father[i]=i;}
}
int find(int x){if(father[x]==x)return x;else return father[x]=find(father[x]);
}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 isTreeAfterRemoveEdge(vector<vector<int>>edges,int deleteEdge){init();for(int i=0;i<edges.size();i++){if(i==deleteEdge) continue;if(isSame(edges[i][0],edges[i][1])){return false;}else{join(edges[i][0],edges[i][1]);}}return true;
}int getRemoveEdge(vector<vector<int>>edges){init();for(int i=0;i<edges.size();i++){if(isSame(edges[i][0],edges[i][1])){return i;}else{join(edges[i][0],edges[i][1]);}}return -1;
}int main(){int n;cin>>n;vector<vector<int>>edges;vector<int>inDegree(n+1,0);for(int i=0;i<n;i++){int s,t;cin>>s>>t;inDegree[t]++;edges.push_back({s,t});}vector<int>vec;   //记录入度为2的边(如果有的话就两条边)for(int i=n-1;i>=0;i--){if(inDegree[edges[i][1]]==2){vec.push_back(i);}}if(vec.size()>0){          //情况1if(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;}else{   //情况2 有环int ans=getRemoveEdge(edges);if(ans>=0)  cout<<edges[ans][0]<<' '<<edges[ans][1];}                       
}

http://www.dtcms.com/a/307058.html

相关文章:

  • 手动 对列表字段进行排序
  • 【高等数学】第七章 微分方程——第四节 一阶线性微分方程
  • LNN+XGBoost:优化多层供应链订购:缓解牛鞭效应
  • C++STL系列之bitset
  • Git——分布式版本控制系统
  • #C语言——学习攻略:深挖指针路线(四)--字符指针变量,数组指针变量,二维数组传参的本质,函数指针变量,函数指针数组
  • ConvertX:自托管的在线文件转换器,支持1000+种格式!
  • Linux系统编程Day1-- 免费云服务器获取以及登录操作
  • CH347使用笔记:CH347作为FPGA下载器的几种方式
  • Maven 配置阿里云镜像加速
  • huggingface是什么?2025-07-30
  • Mac 上配置jdk 环境变量
  • 2. Agent与 React流程
  • 【LY88】双系统指南及避坑
  • Python 的 match-case
  • 从映射到共生:元宇宙、物联网与AI的智能融合生态图谱
  • (LeetCode 面试经典 150 题) 141. 环形链表(快慢指针)
  • HPCtoolkit的下载使用
  • Oracle11g数据库迁移达梦8数据库方案
  • Python序列化和反序列化
  • 如何用Docker部署ROS2
  • (C++)C++类和类的方法(基础教程)(与Python类的区别)
  • c++之基础B之sort排序(第三个参数没有)(第二课)
  • Fiddler中文教程 从入门到进阶的网络抓包与接口调试实战指南
  • Python Pandas.merge_asof函数解析与实战教程
  • VUE前端
  • [Agent开发平台] API网关 | 业务领域 | DTO格式 | 分页令牌
  • React 服务端渲染(SSR)详解
  • 使用 cron 配合 Docker 实现定时任务
  • 神经网络的并行计算与加速技术