![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并查集
【杰杰】
这个作者很懒,什么都没留下…
展开
-
E. Replace the Numbers
传送门题意:执行q次操作,有两个选项:添加一个数或者将当前所有指定的数变为另一个数。思路:我们记录每个数第一次出现的位置,作为“头”,在新添加数的时候,记录每个位置上的数第一次出现的位置,也就是它的“头”。在修改时,只需要合并“头”就行了。#include<bits/stdc++.h>using namespace std;#define ll long long#define endl '\n'int ans[500010];int link[500010];int f原创 2022-01-10 17:23:36 · 350 阅读 · 0 评论 -
Codeforces Round #738 (Div. 2) D1. Mocha and Diana (Easy Version)
传送门题意:给你两个相同数量点的森林,问你最多能在两个森林中加多少相同的边。思路:两个循环即可搞定,用并查集判断加入边<i,j><i,j><i,j>后是否存在环。#include<stdio.h>#include<iostream>#include<string.h>#include<algorithm>#include<map>#include<queue>#include&原创 2021-08-16 10:25:34 · 78 阅读 · 0 评论 -
杭电多校:KD-Graph(并查集)
传送门题意:将图中的点划分为k个集合,求一个值d,对于集合内的点:若点与点之间有直接相连的路径,则这些路径至少有一个小于等于d;对于不同集合的点:若这两点有直接相连的路径,则这些路径全部大于d。思路:这题和点的关系不大,我们更看重边,因为要保证集合内的点之间的边值小于等于某个数,集合与集合之间的边值大于某个数,可以想到一个初步的思路:将边的权值由小到大排列,并按排列后的顺序合并成一个集合(如果先合并权值大的边,就势必会导致集合内的边权值大于集合外边的权值);但仅仅是由小到大合并也无法满足条件,因原创 2021-07-22 22:01:18 · 103 阅读 · 0 评论 -
P1111 修复公路
传送门思路:用并查集来维护村与村之间的联通关系,类似于最小生成树中的并查集用法。#include <bits/stdc++.h>using namespace std;typedef long long ll;struct node{ int u,v,t; friend bool operator < ( node a, node b) { return a.t > b.t; }};priority_queue<node>q;int f[1原创 2021-05-18 22:36:55 · 62 阅读 · 0 评论 -
P1455 搭配购买
传送门思路:用并查集将相同的云朵化为一个集合,并将一个集合内的所有云朵看作一个整体,最后用01背包得到答案。#include <bits/stdc++.h>using namespace std;typedef long long ll;int c[10010],d[10010];int f[10010];int dp[10010];int sumc[10010],sumd[10010];int ansc[10010],ansd[10010];int find(int原创 2021-05-18 22:27:24 · 90 阅读 · 0 评论 -
亲戚
传送门#include<bits/stdc++.h>using namespace std;int f[5010];int find(int x){ if(f[x]!=x) return f[x] = find(f[x]); return x;}int main(){ int n,m,p; cin>>n>>m>>p; for(int i = 1; i <= n; i++) f[i] = i; while(m--) {原创 2021-04-27 23:16:03 · 77 阅读 · 0 评论 -
选学霸
传送门思路:需要先用并查集找出每一个需要选择的不同的学霸堆,然后就是01背包的板子题。#include<bits/stdc++.h>using namespace std;const int mod = 1000007;int f[40010];int ans[40010];int vis[40010];int dp[40010];int find(int x){ if(f[x] != x) return f[x] = find(f[x]); return x;原创 2021-04-26 23:45:02 · 100 阅读 · 0 评论 -
合并集合
一共有n个数,编号是1~n,最开始每个数各自在一个集合中。现在要进行m个操作,操作共有两种:“M a b”,将编号为a和b的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;“Q a b”,询问编号为a和b的两个数是否在同一个集合中;输入格式第一行输入整数n和m。接下来m行,每行包含一个操作指令,指令为“M a b”或“Q a b”中的一种。输出格式对于每个询问指令”Q a b”,都要输出一个结果,如果a和b在同一集合内,则输出“Yes”,否则输出“No”。每个结果占一行原创 2021-03-16 19:14:39 · 103 阅读 · 0 评论 -
P2256 一中校运会之百米跑
传送门思路:变种后的并查集,用map<string,string>来存。#include<bits/stdc++.h>using namespace std;const int mod = 1e9 + 7;const int inf = 0x3f3f3f3f;#define ll long long map<string,string>f;string find(string x){ if(f[x] != x) return f[x]原创 2021-03-03 13:53:20 · 80 阅读 · 0 评论 -
P1536 村村通
传送门题目描述某市调查城镇交通状况,得到现有城镇道路统计表。表中列出了每条道路直接连通的城镇。市政府 “村村通工程” 的目标是使全市任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要相互之间可达即可)。请你计算出最少还需要建设多少条道路?输入格式输入包含若干组测试测试数据,每组测试数据的第一行给出两个用空格隔开的正整数,分别是城镇数目 n 和道路数目 m ;随后的 m 行对应 m 条道路,每行给出一对用空格隔开的正整数,分别是该条道路直接相连的两个城镇的编号。简单起见,城镇从 1 到 n原创 2021-03-02 18:01:55 · 129 阅读 · 0 评论 -
P2835 刻录光盘
传送门思路:单向并查集,因为不会,所以用了floyd。#include<bits/stdc++.h>using namespace std;const int mod = 1e9 + 7;const int inf = 0x3f3f3f3f;#define ll long long int f[1010];bool g[210][210];int n;void floyd(){ for(int k = 1; k <= n; k++) { for(原创 2021-03-02 17:04:56 · 109 阅读 · 0 评论 -
P2078 朋友
传送门题目背景小明在A公司工作,小红在B公司工作。题目描述这两个公司的员工有一个特点:一个公司的员工都是同性。A公司有N名员工,其中有P对朋友关系。B公司有M名员工,其中有Q对朋友关系。朋友的朋友一定还是朋友。每对朋友关系用两个整数(Xi,Yi)组成,表示朋友的编号分别为Xi,Yi。男人的编号是正数,女人的编号是负数。小明的编号是1,小红的编号是-1.大家都知道,小明和小红是朋友,那么,请你写一个程序求出两公司之间,通过小明和小红认识的人最多一共能配成多少对情侣。(包括他们自己)输入格式第原创 2021-02-28 16:29:14 · 260 阅读 · 0 评论