题目

给出一个 \(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. 学习go语言编程之面向对象

    类型系统 类型系统是指一个语言的类型体系结构,一个典型的类型系统通常包含如下基本内容: 基础类型,如:byte.int.bool.float等 复合类型,如:数组.结构体.指针等 可以指向任意对象的类 ...

  2. 【Azure 应用服务】在App Service for Windows中实现反向代理

    问题描述 如何在App Service for Windows(.NET Stack)中,如何实现反向代理呢? 正向代理:客户端想要访问一个服务器,但是它可能无法直接访问这台服务器,这时候这可找一台可 ...

  3. 【Azure 应用服务】Azure Function HTTP Trigger 遇见奇妙的500 Internal Server Error: Failed to forward request to http://169.254.130.x

    问题描述 使用 Azure Funciton App,在本地运行完全成功的Python代码,发布到Azure Function就出现了500  Internal Server Error. 而且错误消 ...

  4. Educational Codeforces Round 145 (Rated for Div. 2)C. Sum on Subarrays(构造)

    很意思的一道构造题 题意:给一个\(n.k\),让构造长度为n的数组满足,子数组为整数的个数为k个,负数的为\(k-(n+1)* n/2\),每个数的范围为\([-1000,1000]\) 这种构造题 ...

  5. Java核心之细说泛型

    泛型是什么? 等你使用java逐渐深入以后会了解或逐步使用到Java泛型.Java 中的泛型是 JDK 5 中引入的功能之一."Java 泛型 "是一个技术术语,表示一组与定义和使 ...

  6. RCC & GPIO库函数&传感器输入

    RCC: Reset and Clock Control,即复位和时钟控制.   一般在.h文件的末尾都是一些函数声明,RCC常用的三个函数(外设时钟控制,没有时钟外设不工作): void RCC_A ...

  7. 新博客 VuejsDev.com 用于梳理知识点

    新博客 VuejsDev.com 用于梳理知识点 https://www.vuejsdev.com/ 后期没有精力发布了,迁移到博客园了,防止服务器到期~ [VueJsDev] 目录列表 https: ...

  8. linux脚本免密的方法/不用输入密码

    第一种方法:使用管道(上一个命令的 stdout 接到下一个命令的 stdin):在脚本首行添加 #!/bin/bashecho password | sudo -S apt-get update 第 ...

  9. python中往json中添加文件的方法

    一 前言: python中常用的一种方式,这里给大家列出来一下. 二 实例 比如,最简单的一个json文件 test_json = { "a": 1, "b": ...

  10. 在salesforce中如何获取Security Token

    Trailhead练习Soap API使用Soap UI时,需要Security Token才能登录,在Lightning一直找不到,后来切换到Classic才找到.现在提供一个简单粗暴的方式,快速定 ...