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