CF891C Envy【最小生成树】
我们知道,根据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【最小生成树】的更多相关文章
- CF891C Envy 最小生成树/虚树
正解:最小生成树/虚树 解题报告: 传送门! sd如我就只想到了最暴力的想法,一点儿优化都麻油想到,,,真的菜到爆炸了QAQ 然后就分别港下两个正解QAQ 法一,最小生成树 这个主要是要想到关于最小生 ...
- CF891C Envy
题面 题解 首先要知道两个性质: 对于任意权值,最小生成树上该权值的边数是相同的. 对于任意一个最小生成树,当加完所有权值小于一个任意值的边之后,当前图的连通性是一样的. 于是我们按照权值分开处理,对 ...
- CF891C Envy(离线/在线+可撤销并查集/并查集/LCT)
前置知识 最小生成树及证明 做法 每个不同权值没影响,仅需判断该次询问每种权值是否在"小于该权值的所有边加完"之后,可以全部加进来 离线:询问的所有边全堆到一起,按权值排序,然后同 ...
- CF892E Envy[最小生成树]
题意:有一张 $n$ 个点$ m $条边的连通图.有$Q$ 次询问.每次询问给出 $k[i]$ 条边,问这些边能否同时出现在一棵最小生成树上.$n,m,Q,\sum k\le 500000$. 这题利 ...
- [CF891C] Envy - Kruskal,并查集
给出一个 n 个点 m条边的无向图,每条边有边权,共 Q次询问,每次给出 \(k\)条边,问这些边能否同时在一棵最小生成树上. Solution 所有最小生成树中某权值的边的数量是一定的 加完小于某权 ...
- 题解 [CF891C] Envy
题面 解析 首先根据Kruskal算法, 我们可以知道, 在加入权值为\(w\)的边时, 权值小于\(w\)的边都已经加进树里了(除了连成环的). 所以,我们可以保存一下每条边的端点在加入生成树之前的 ...
- 【题解】CF891CEnvy
[题解] CF891C Envy 很好玩的一道题.尽管不难,但是调了很久QAQ 考虑克鲁斯卡尔最小生成树的算法,可以发现这些最小树生成的性质: 当生成树所有边的权值都\(\le\)某个$ w$的时刻, ...
- 【CF891C】Envy(最小生成树)
[CF891C]Envy(最小生成树) 题面 Codeforces 洛谷 题解 考虑\(MST\)的构建过程,对于所有权值相同的边一起考虑. 显然最终他们连出来的结果是固定的. 把连边改为把联通块联通 ...
- 【CF891C】Envy 离线+最小生成树
[CF891C]Envy 题意:给你一个图,边有边权,每次询问给你一堆边,问你是否存在一个原图的最小生成树包含给出的所有边.n,m,q<=100000 题解:思路很好的题. 首先有一个非常重要的 ...
随机推荐
- VS.NET(C#)--1.3_VS2005开始
VS2005开始 开始页 1.文件系统:这是默认,把网站创建到当前物理文件系统上(可以本地或网络).此时VS2005将使用内置的Web服务器,不使用IIS运行Web应用程序.2.HTTP使用IIS处理 ...
- kvm第五章--虚拟迁移
- Hadoop HA 搭建
Hadoop HA 什么是 HA HA是High Available缩写,是双机集群系统简称,指高可用性集群,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,且分为活动节点及备用节点.通常 ...
- element-ui default-checked-keys 会把节点下所有子节点全部勾选解决方法
<el-tree class="filter-tree" :data="permissionData" :props="props" ...
- S5PV210 时钟
CLOCK DOMAINS 时钟域 S5PV210 consists of three clock domains, namely, main system (MSYS), display syste ...
- angular2-cli 环境搭建
开发工具:windows ,Vscode, npm, 前提:安装nodejs nodejs 模块全局安装路径配置:http://www.cnblogs.com/rancho-blog/p/656792 ...
- 【JUC】1.线程
先复习一下线程的东西: Java线程的内存模型 主内存与工作内存 Java内存模型主要定义了程序中各个变量的访问规则 所有的变量都在主内存,Java堆(线程共享) 每条线程都有自己的工作内存,虚拟机栈 ...
- ORA-03113:通信通道的文件结尾 解决办法
登录Oracle时出现错误:“ORA-03113:通信通道的文件结尾” 错误排查方法 Oracle出现错误,查看trace日志寻找问题根源:D:\oracle\diag\rdbms\orcl\orcl ...
- spark 实现多文件输出
需求 不同的key输出到不同的文件 txt文件 multiple.txt 中国;22 美国;4342 中国;123 日本;44 日本;6 美国;55 美国;43765 日本;786 日本;55 sca ...
- 如何修改配置文件:CentOS下SSH端口修改
CentOS各发行版中SSH端口默认为22,如果正式做站或其它用途,为了提高安全性就需要修改掉默认的SSH端口号,防止被有心人穷举密码.部分VPS提供商,若您的VPS服务器SSH遭受多次的暴力破解,可 ...