题目链接

我们知道,根据Kruskal的贪心,对于最小生成树,每一种权值的边数是一样的,而且如果将\(\leq x\)的边做最小生成树,合法方案的联通性是一样的。所以我们可以对于所有边分开考虑。

对于一组询问,对于所有权值,权值为\(x\)的有\(k\)个,那么可以将\(<x\)的边全部加入,然后将这\(k\)个边加入,看看能不能全部加入进去。如果有一个成环了,那么肯定是不行的。

那么\(q\)组询问,可以离线下来,对于(边权,询问编号)二元组排序,然后对于同一边权的同一组询问,尝试加入,到了下一组询问就撤销,然后处理完之后又全部加入进去。用可撤销并查集就可以做了。

#include<bits/stdc++.h>
#define Rint register int
using namespace std;
const int N = 500003;
int n, m, k, q, mx, fa[N], siz[N];
bool ans[N];
struct Edge {
int u, v, w;
inline bool operator < (const Edge &o) const {return w < o.w;}
} e[N];
struct Query {
int u, v, w, id;
inline bool operator < (const Query &o) const {return id < o.id;}
};
vector<Query> vec[N];
inline int getfa(int x){
return x == fa[x] ? x : getfa(fa[x]);
}
int stk[N], top;
inline bool comb(int x, int y){
x = getfa(x); y = getfa(y);
if(x != y){
if(siz[x] > siz[y]) swap(x, y);
siz[y] += siz[x]; fa[x] = y; stk[++ top] = x;
return true;
}
return false;
}
int main(){
scanf("%d%d", &n, &m);
for(Rint i = 1;i <= m;i ++) scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].w), mx = max(mx, e[i].w);
scanf("%d", &q);
for(Rint i = 1;i <= q;i ++){
scanf("%d", &k);
while(k --){
int now; scanf("%d", &now);
vec[e[now].w].push_back((Query){e[now].u, e[now].v, e[now].w, i});
}
}
for(Rint i = 1;i <= mx;i ++) if(!vec[i].empty())
sort(vec[i].begin(), vec[i].end());
sort(e + 1, e + m + 1);
for(Rint i = 1;i <= n;i ++) siz[i] = 1, fa[i] = i;
for(Rint i = 1;i <= q;i ++) ans[i] = true;
for(Rint i = 1;i <= m;){
int val = e[i].w; top = 0;
for(Rint j = 0;j < vec[val].size();j ++){
if(!ans[vec[val][j].id]) continue;
if(j && vec[val][j].id != vec[val][j - 1].id){
while(top){
siz[fa[stk[top]]] -= siz[stk[top]];
fa[stk[top]] = stk[top]; -- top;
}
}
if(!comb(vec[val][j].u, vec[val][j].v)) ans[vec[val][j].id] = false;
}
while(e[i].w == val){
comb(e[i].u, e[i].v); ++ i;
}
}
for(Rint i = 1;i <= q;i ++) puts(ans[i] ? "YES" : "NO");
}

CF891C Envy【最小生成树】的更多相关文章

  1. CF891C Envy 最小生成树/虚树

    正解:最小生成树/虚树 解题报告: 传送门! sd如我就只想到了最暴力的想法,一点儿优化都麻油想到,,,真的菜到爆炸了QAQ 然后就分别港下两个正解QAQ 法一,最小生成树 这个主要是要想到关于最小生 ...

  2. CF891C Envy

    题面 题解 首先要知道两个性质: 对于任意权值,最小生成树上该权值的边数是相同的. 对于任意一个最小生成树,当加完所有权值小于一个任意值的边之后,当前图的连通性是一样的. 于是我们按照权值分开处理,对 ...

  3. CF891C Envy(离线/在线+可撤销并查集/并查集/LCT)

    前置知识 最小生成树及证明 做法 每个不同权值没影响,仅需判断该次询问每种权值是否在"小于该权值的所有边加完"之后,可以全部加进来 离线:询问的所有边全堆到一起,按权值排序,然后同 ...

  4. CF892E Envy[最小生成树]

    题意:有一张 $n$ 个点$ m $条边的连通图.有$Q$ 次询问.每次询问给出 $k[i]$ 条边,问这些边能否同时出现在一棵最小生成树上.$n,m,Q,\sum k\le 500000$. 这题利 ...

  5. [CF891C] Envy - Kruskal,并查集

    给出一个 n 个点 m条边的无向图,每条边有边权,共 Q次询问,每次给出 \(k\)条边,问这些边能否同时在一棵最小生成树上. Solution 所有最小生成树中某权值的边的数量是一定的 加完小于某权 ...

  6. 题解 [CF891C] Envy

    题面 解析 首先根据Kruskal算法, 我们可以知道, 在加入权值为\(w\)的边时, 权值小于\(w\)的边都已经加进树里了(除了连成环的). 所以,我们可以保存一下每条边的端点在加入生成树之前的 ...

  7. 【题解】CF891CEnvy

    [题解] CF891C Envy 很好玩的一道题.尽管不难,但是调了很久QAQ 考虑克鲁斯卡尔最小生成树的算法,可以发现这些最小树生成的性质: 当生成树所有边的权值都\(\le\)某个$ w$的时刻, ...

  8. 【CF891C】Envy(最小生成树)

    [CF891C]Envy(最小生成树) 题面 Codeforces 洛谷 题解 考虑\(MST\)的构建过程,对于所有权值相同的边一起考虑. 显然最终他们连出来的结果是固定的. 把连边改为把联通块联通 ...

  9. 【CF891C】Envy 离线+最小生成树

    [CF891C]Envy 题意:给你一个图,边有边权,每次询问给你一堆边,问你是否存在一个原图的最小生成树包含给出的所有边.n,m,q<=100000 题解:思路很好的题. 首先有一个非常重要的 ...

随机推荐

  1. LOJ3049 [十二省联考2019] 字符串问题 【后缀自动机】【倍增】【拓扑排序】

    题目分析: 建出后缀自动机,然后把A串用倍增定位到后缀自动机上,再把B串用倍增定位到后缀自动机上. SAM上每个点上的A串根据长度从小到大排序,建点,依次连边. 再对于SAM上面每个点,连到儿子的边, ...

  2. sqlserver 转化函数

    --查询系统当前时间select GETDATE() as date;------------------------- 0-14 ------------------select CONVERT(V ...

  3. 音视频入门-07-认识YUV

    * 音视频入门文章目录 * YUV & YCbCr 简介 YUV,是一种颜色编码方法.常使用在各个视频处理组件中. YUV 在对照片或视频编码时,考虑到人类的感知能力,允许降低色度的带宽. Y ...

  4. Spring Cloud Alibaba学习笔记(7) - Sentinel规则持久化及生产环境使用

    Sentinel 控制台 需要具备下面几个特性: 规则管理及推送,集中管理和推送规则.sentinel-core 提供 API 和扩展接口来接收信息.开发者需要根据自己的环境,选取一个可靠的推送规则方 ...

  5. hdu 5432

    Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, so he ...

  6. Ubuntu下编译 Hadoop2.9

    Ubuntu 下编译 Hadoop-2.9.2 系统环境 系统: ubuntu-18.10-desktop-amd64 maven: Apache Maven 3.6.0 jdk: jdk_1.8.0 ...

  7. linux 下调用wps 注意

    记录笔记以防忘记 wps 是界面程序,linux 必须在界面终端中调用 wps 命令才能打开软件 xshell 连接时启动tomcat ,wps命令 会使用Xshell 的隧道转发,只有在界面下的终端 ...

  8. 【已解决】老型号电脑需要按F1键才能进入系统

    [已解决]老型号电脑需要按F1键才能进入系统 本文作者:天析 作者邮箱:2200475850@qq.com 发布时间: Tue, 16 Jul 2019 20:49:00 +0800 问题描述:电脑因 ...

  9. 简单记录一次注入到shell

    0x00 前言 帮朋友之前拿的一个站,有点久了没有完整截图,简单记录一下. 0x01 基础信息 操作系统:win 集成环境:phpstudy 端口开放:82,3306,3389 有phpmyadmin ...

  10. 流程控制 if----else

    流程控制: 对PHP程序执行的过程进行控制! PHP有哪些手段对程序执行过程进行控制!一.顺序执行 自上而下的执行即可! 对这个执行过程没有控制!二.分支执行 分支执行可以根据条件是否满足来选择执行某 ...