并查集
并查集
谁是凶手1703
这个作者很懒,什么都没留下…
展开
-
食物链【带权并查集】
//涉及到集合,合并 使用并查集https://www.acwing.com/problem/content/description/242/#include<iostream>using namespace std;const int N=50000+10;int f[N],d[N];int n,k;//x-->f[x]---->rootint find(...原创 2019-08-15 11:35:59 · 97 阅读 · 0 评论 -
程序自动分析【并查集+离散化】
在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足。考虑一个约束满足问题的简化版本:假设x1,x2,x3,…代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变量相等/不等的约束条件,请判定是否可以分别为每一个变量赋予恰当的值,使得上述所有约束条件同时被满足。例如,一个问题中的约束条件为:x1=x2,x2=x3,x3=x4,x1≠x4,这些约束条件显然是不可能同时被满...原创 2019-08-24 15:15:02 · 83 阅读 · 0 评论 -
超市【贪心+并查集优化】
https://www.acwing.com/solution/acwing/content/1350/贪心策略:在不过期的时间内优先卖出利润更大的产品。按照价值降序,每次扫描到一个价值,尝试一下在过期之前能不能卖出去;此时可能已经有比它更大价值的产品占用了一些日期,于是从过期时间往前面找,直到找到一个空位置。如果这个空位置大于0,那么就把这个产品安排在这天卖出。暴力找位置最坏复杂度可以达...原创 2019-08-24 19:27:56 · 171 阅读 · 0 评论 -
银河英雄传说【带权并查集】
添加链接描述d[N] 数组记录离父节点的距离,size数组记录父节点的大小#include <bits/stdc++.h>using namespace std;const int N=31000+10;int fa[N],n,t,i,j,d[N],size[N];//size就是记录个数int get(int x){ if(x==fa[x] ) return x...原创 2019-08-24 20:33:53 · 117 阅读 · 0 评论 -
奇偶游戏【并查集】【离散化】【poj1733】
添加链接描述题解来自:https://www.acwing.com/solution/acwing/content/1006/#include<bits/stdc++.h>using namespace std;const int N=2e4+10;struct { int l,r,ans;}q[20010];int a[N],fa[N],d[N],n,m,t;...原创 2019-08-24 22:02:30 · 163 阅读 · 0 评论 -
奇偶游戏【扩展域并查集】
题目链接 点这里把每个点拆成俩个节点:x_odd和x_even 分别表示为奇数或者偶数,奇数域 和偶数域``#include#includeusing namespace std;const int N=2e4+10;struct{int l,r,op;}q[N];int n,m,b[N],cnt,f[N];int get(int x){return x==f[x]?x...原创 2019-08-25 10:12:03 · 205 阅读 · 0 评论 -
食物链【拓展域并查集】
题目链接拓展域并查集:拆点拆成3种,A,B, C判断是否满足用==,不可以用!=间接判断#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#define rep(i,a,b) for(int i = a;i <= b;i++)...原创 2019-08-25 11:33:21 · 154 阅读 · 0 评论 -
并查集判树
给一堆边,判断是不是一颗树并查集的操作#include<stdio.h>#include<string.h>#define N 1000int p[N]={0};int find(int x){ //return x==p[x]?x:p[x]=find(p[x]); while(x!=p[x]) x=p[x]; return x...原创 2019-12-09 21:07:14 · 118 阅读 · 0 评论 -
网络分析【并查集】【联通块统一加权重,转化为虚拟根节点加权重】
网络分析题意操作 1 :把两个点所在的连通块合并起来操作 2 :向某个点所在的连通块的所有点累加一个值思路联通块合并,基础的并查操作,考虑怎么给某一个点中所有联通块加某个值。我们不能把简单的把这个联通块父节点加一个值,最后处理完,每个点的值+=联通块节点的值,因为,find操作会把父节点换来换去。当俩个节点,不联通时候:我们开一个新节点,作为这俩节点的父节点。我们每次给这些虚拟节点加权值。为了最后把这些权值放会子节点,我们可以给虚拟节点向子节点连接一条边。最后dfs把虚拟节点的值放回子节点。要注原创 2020-10-10 00:15:54 · 179 阅读 · 0 评论 -
修改数组【并查集维护集合的最大值、连续数字的最大值】
修改数组题意思路并查集蛮巧妙用法,暴力的话,加个st数组,每次用while判断就好了。这个题实际上要求出:一段连续的数的最大值(这个数没有被使用过)要是x被使用过,我们把这个f[X]=X+1,把x的父节点指向x+1。将前面枚举过的元素用一个集合来表示,集合的根元素是集合所有元素的最大值.代码#include <cstdio>const int N = 1100010;int p[N];int find(int x){ if (p[x] != x) p[x]原创 2020-10-11 15:16:19 · 707 阅读 · 0 评论