题目

给出一个 \(n\) 个点 \(m\) 条边的无向图,每条边有边权,共 \(Q\) 次询问,

每次给出 \(k_i\) 条边,问这些边能否同时在一棵最小生成树上。


分析

考虑最小生成树选择的边权的种类和数量是固定的,

那么可以按照边权排序,小于该边权的边已经用来构建MST,只需要考虑该边权的边。

按照不同的询问把边加进去看看是否不成环,处理一个询问再把刚刚加入的边撤销。


代码

#include <cstdio>
#include <cctype>
#include <vector>
#include <algorithm>
#define rr register
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin)),p1==p2?EOF:*p1++)
using namespace std;
const int N=500011; struct rec{int x,y,w;}e[N]; vector<rec>K[N]; char buf[1<<21],*p1,*p2;
int f[N],dep[N],n,m,Q,ans[N],stac[N],tac[N],stad[N*10],tad[N*10],tot,tod;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
bool cmp(rec x,rec y){return x.w<y.w;}
inline signed getf(int u){
if (f[u]==u) return u;
rr int U=getf(f[u]);
if (dep[u]<dep[f[u]]+1){
stad[++tod]=u,tad[tod]=dep[u];
dep[u]=dep[f[u]]+1;
}
return U;
}
inline bool Merge(int x,int y){
rr int fa=getf(x),fb=getf(y);
if (fa==fb) return 0;
if (dep[fa]>dep[fb]) fa^=fb,fb^=fa,fa^=fb;
if (dep[fa]==dep[fb])
stad[++tod]=fb,tad[tod]=dep[fb]++;
stac[++tot]=fa,tac[tot]=f[fa],f[fa]=fb;
return 1;
}
signed main(){
n=iut(),m=iut();
for (rr int i=1;i<=m;++i)
e[i]=(rec){iut(),iut(),iut()};
for (rr int i=1;i<=n;++i) dep[i]=1,f[i]=i;
Q=iut();
for (rr int i=1;i<=Q;++i)
for (rr int j=iut();j;--j){
rr int t=iut();
K[e[t].w].push_back((rec){e[t].x,e[t].y,i});
}
for (rr int i=1;i<=Q;++i) ans[i]=1;
sort(e+1,e+1+m,cmp);
for (rr int l=1,r;l<=m;l=r+1){
for (r=l;e[r].w==e[l].w;++r); --r;
rr int len=K[e[l].w].size();
tot=tod=0;
for (rr int i=0;i<len;++i){
rr rec t=K[e[l].w][i];
if (!ans[t.w]) continue;
if (i>0&&t.w!=K[e[l].w][i-1].w){
for (;tot;--tot) f[stac[tot]]=tac[tot];
for (;tod;--tod) dep[stad[tod]]=tad[tod];
}
ans[t.w]&=Merge(t.x,t.y);
}
for (rr int i=l;i<=r;++i) Merge(e[i].x,e[i].y);
}
for (rr int i=1;i<=Q;++i) puts(ans[i]?"YES":"NO");
return 0;
}

#Kruskal,可撤销并查集#CF891C Envy的更多相关文章

  1. CodeForces892E 可撤销并查集/最小生成树

    http://codeforces.com/problemset/problem/892/E 题意:给出一个 n 个点 m 条边的无向图,每条边有边权,共 Q 次询问,每次给出 ki​ 条边,问这些边 ...

  2. codeforces 892E(离散化+可撤销并查集)

    题意 给出一个n个点m条边的无向联通图(n,m<=5e5),有q(q<=5e5)个询问 每个询问询问一个边集{Ei},回答这些边能否在同一个最小生成树中 分析 要知道一个性质,就是权值不同 ...

  3. bzoj2049 线段树 + 可撤销并查集

    https://www.lydsy.com/JudgeOnline/problem.php?id=2049 线段树真神奇 题意:给出一波操作,拆边加边以及询问两点是否联通. 听说常规方法是在线LCT, ...

  4. BZOJ4358: permu(带撤销并查集 不删除莫队)

    题意 题目链接 Sol 感觉自己已经老的爬不动了.. 想了一会儿,大概用个不删除莫队+带撤销并查集就能搞了吧,\(n \sqrt{n} logn\)应该卡的过去 不过不删除莫队咋写来着?....跑去学 ...

  5. 【离线 撤销并查集 线段树分治】bzoj1018: [SHOI2008]堵塞的交通traffic

    本题可化成更一般的问题:离线动态图询问连通性 当然可以利用它的特殊性质,采用在线线段树维护一些标记的方法 Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常 ...

  6. 【Codeforces576E_CF576E】Painting Edges(可撤销并查集+线段树分治)

    题目 CF576E 分析: 从前天早上肝到明天早上qwq其实颓了一上午MC ,自己瞎yy然后1A,写篇博客庆祝一下. 首先做这题之前推荐一道很相似的题:[BZOJ4025]二分图(可撤销并查集+线段树 ...

  7. 【BZOJ4025】二分图(可撤销并查集+线段树分治)

    题目: BZOJ4025 分析: 定理:一个图是二分图的充要条件是不存在奇环. 先考虑一个弱化的问题:保证所有边出现的时间段不会交叉,只会包含或相离. 还是不会?再考虑一个更弱化的问题:边只会出现不会 ...

  8. 算法笔记--可撤销并查集 && 可持久化并查集

    可撤销并查集模板: struct UFS { stack<pair<int*, int>> stk; int fa[N], rnk[N]; inline void init(i ...

  9. 2019牛客第八场多校 E_Explorer 可撤销并查集(栈)+线段树

    目录 题意: 分析: @(2019牛客暑期多校训练营(第八场)E_Explorer) 题意: 链接 题目类似:CF366D,Gym101652T 本题给你\(n(100000)\)个点\(m(1000 ...

  10. Codeforces 938G 线段树分治 线性基 可撤销并查集

    Codeforces 938G Shortest Path Queries 一张连通图,三种操作 1.给x和y之间加上边权为d的边,保证不会产生重边 2.删除x和y之间的边,保证此边之前存在 3.询问 ...

随机推荐

  1. 项目实战:Qt数据分析处理平台(兼容各国产麒麟系统)(文件域字符串解析,上万文件批量导入,折线图、散点图,正态分布图分析处理导出等)

    若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/114710650长期持续带来更多项目与技术分享, ...

  2. Linux开端---Centos

    Linux-Centos 虚拟化所需工具:https://pan.baidu.com/s/1643-kYcx9oPGnGEZM1pLOw?pwd=g0v5 提取码:g0v5 问题解决 正常注册网络适配 ...

  3. 【LeetCode二叉树#03】翻转二叉树的几种方法

    翻转二叉树 力扣题目链接(opens new window) 翻转一棵二叉树. 这道题目背后有一个让程序员心酸的故事,听说 Homebrew的作者Max Howell,就是因为没在白板上写出翻转二叉树 ...

  4. 【Azure 事件中心】使用Kafka的性能测试工具(kafka-producer-perf-test)测试生产者发送消息到Azure Event Hub的性能

    问题描述 Azure Event Hub支持 kafka,所以为了测试消息生产者所在环境与Azure Event  Hub之间发送消息的性能如何,特别使用 kafka 官方测试生产者,消费者的性能工具 ...

  5. 使用OpenFeign远程调用时请求头处理报错问题

    1. 错误信息 basic.result.exception.OtherException: feign error:系统异常:Content type 'multipart/form-data;bo ...

  6. Java 值传递+引用传递

    1 /* 2 * 3 * 方法的形参的传递机制:值传递 4 * 5 * 1.形参:方法定义时,声明的小括号内的参数 6 * 实参:方法调用时,实际传递给形参的数据 7 * 8 * 9 * 2.值传递的 ...

  7. Github登录 2FA(Two-Factor Authentication/两因素认证) 浏览器插件-已验证

    Github登录 2FA(Two-Factor Authentication/两因素认证) 浏览器插件-已验证 chrome 装下这个扩展 身份验证器 https://chromewebstore.g ...

  8. Java求解汉诺塔

    汉诺塔 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗 ...

  9. 为aws中国配置docker镜像加速

    在AWS中国,docker镜像基本无法拉取,更换国内镜像是必须的. 修改docker配置文件 sudo vi /etc/sysconfig/docker 找到OPTIONS参数,在后面加上" ...

  10. uniapp使用uview报错Cannot find module ‘@/uni_modules/uview-ui/components

    参考:https://github.com/umicro/uView 记录使用uniapp报的错 注意uview目前只支持vue2 按照教程引入uview,然后执行的时候还是会报Cannot find ...