题目

给出一个 \(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. __init_subclass__特殊方法

    __init_subclass__ 是 Python 3.6 引入的一个特殊方法,用于在子类被定义时执行一些操作. 这个方法允许你在父类中定义一个类方法,当子类继承父类时会自动调用这个方法,你可以在其 ...

  2. PrettyTable模块

    # 用来生成美观的ASCII格式的表格 pip install prettytable # 导入 from prettytable import PrettyTable # 使用 tb = pt.Pr ...

  3. 【Azure Developer】使用Python代码获取VM的IP地址 (Public IP + Private IP)【未解决问题标签】

    记录使用以下的代码获取Azure VM中的IP地址 """Create and manage virtual machines. This script expects ...

  4. 【Azure API 管理】如何修改Azure APIM的管理员邮箱和组织名称

    问题描述 当创建一个新的APIM服务时,会要求输入组织名称(Organization name)和管理员邮箱(Administrator email :Set the e-mail address t ...

  5. Java 递归方法的使用 + 例子

    1 /* 2 * 递归方法的使用 3 * 1.递归方法:一个方法体内调用它自身 4 * 2.方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无须循环控制 5 * 递归一定要想已知方向 ...

  6. linux vs code extension C# `GLIBC_2.27' not found

    settings中omnisharp:useModernNet改为true reboot虚机

  7. Failed to execute goal on project WebBackend: Could not resolve dependencies for project com.lang.yi:WebBackend:jar:1.0.0

    一.问题由来 自己在搭建项目的时候报一个错误,如标题所示,具体错误信息如下: Failed to execute goal on project WebBackend: Could not resol ...

  8. java中webSocket发送图片文件数据非常慢

    一.问题由来 目前在开发的这个小程序中有一个功能需要和Unity客户端进行互动操作,互动的大致流程为在微信小程序中点击一个操作,发送一个HTTP请求, Java后台收到这个请求后,会给Unity客户端 ...

  9. setting.json 20210825 更新

    vue代码格式化思路 { "pasteImage.path": "${currentFileNameWithoutExt}_Images/", "up ...

  10. Neural Dynamics on Complex Networks-KDD20

    一.摘要 学习复杂网络上的连续时间动态对于理解.预测和控制科学和工程中的复杂系统至关重要.然而,由于高维系统结构中的组合复杂性.它们难以捉摸的连续时间非线性动力学以及它们的结构-动力学依赖性,使得这项 ...