并查集
llll215
这个作者很懒,什么都没留下…
展开
-
洛谷 P2078 朋友
思路是分为两个并查集,然后计算下男女人数,然后直接比较,选小的 代码写的有点麻烦好像,交上去也没过,虽然结果对了 其实第一遍已经发现有问题了,因为比较的时候不小心把小于号打成大于号,然后就输出了朋友较多的男方,但是结果居然是5,交上去果然错了,后面第二遍代码就继续试了下男方,是对的,3,但是交上去还是unexpected 30. 想想好像是要考虑负号,毕竟数组没有a[-1],改成了 combine_2(abs(x2),abs(y2)); 加了绝对值,交上去还是错的,有点烦了 ...原创 2022-01-21 01:31:25 · 656 阅读 · 0 评论 -
洛谷 P1455 搭配购买
还是并查集,n朵云,m个搭配,和手里的钱w,然后是每朵云的价钱和价值,再是云与云之间的搭配。 思路: 1.还是用combine函数把所有搭配连起来(可能有分散的不知道多少个集合) 2.增加的一个难点就是统计每个集合的总价钱和总价值 (每个集合的根节点都还是初始化的-1) 3.将每个集合的总价值比较,求出总价值最大且总价钱不超过w的 难点的解决办法: 每朵云都有编号,parent[编号]就代表这朵云的父节点所代表的云的编号,根节点的父节点的值是-1,在每一次的结合过程中,把结合进去的云或云...原创 2022-01-21 14:56:40 · 301 阅读 · 0 评论 -
洛谷 P1111 修复公路
其实还是考查并查集,但是增加了一个问题,就是任意两个村庄都可通车的最短时间(可以是多条公路连成一条道路),看输出结果这些公路大概是能同时修的,还是先套用并查集的模板先把输入的公路都连通,然后考虑如何检查是否有两个村庄无法通车,再考虑如何计算通车时间。 1.利用了parent数组并初始化所有结点为-1,所以所有村庄通车后只会有一个村庄的数组标记还是-1(根节点),所以只要检查所有村庄中是否存在两个或以上村庄仍=-1就行,没有就可以通车。 2.计算最短时间可以看有没有环存在,没有环存在那么说明村庄与村庄之间原创 2022-01-21 21:12:46 · 495 阅读 · 0 评论 -
洛谷 P1551 亲戚
本质还是并查集,模板套用一下就可以了,挺简单 #include<iostream> using namespace std; #define MAX_TREE_SIZE 10010 int parent[MAX_TREE_SIZE]={0};//创建一个结点数组 int deep[MAX_TREE_SIZE]={0}; void initial(int n)//初始化 { for(int i=0;i<n;i++) { parent[i]=-1; deep[i..原创 2022-01-20 15:49:49 · 275 阅读 · 0 评论 -
洛谷 P3367 【模板】并查集
看了并查集的视频,讲的挺清楚的:https://www.bilibili.com/video/BV13t411v7Fs?p=2 然后就分模块写了代码: 创建一维数组并初始化 #define MAX_TREE_SIZE 10010 int parent[MAX_TREE_SIZE]={0};//创建一个结点数组 void initial(int n)//初始化 { for(int i=0;i<n;i++) { parent[i]=-1; } } 寻找根节点 ...原创 2022-01-19 15:38:02 · 450 阅读 · 0 评论