#Kruskal,可撤销并查集#CF891C Envy
题目
给出一个 \(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的更多相关文章
- CodeForces892E 可撤销并查集/最小生成树
http://codeforces.com/problemset/problem/892/E 题意:给出一个 n 个点 m 条边的无向图,每条边有边权,共 Q 次询问,每次给出 ki 条边,问这些边 ...
- codeforces 892E(离散化+可撤销并查集)
题意 给出一个n个点m条边的无向联通图(n,m<=5e5),有q(q<=5e5)个询问 每个询问询问一个边集{Ei},回答这些边能否在同一个最小生成树中 分析 要知道一个性质,就是权值不同 ...
- bzoj2049 线段树 + 可撤销并查集
https://www.lydsy.com/JudgeOnline/problem.php?id=2049 线段树真神奇 题意:给出一波操作,拆边加边以及询问两点是否联通. 听说常规方法是在线LCT, ...
- BZOJ4358: permu(带撤销并查集 不删除莫队)
题意 题目链接 Sol 感觉自己已经老的爬不动了.. 想了一会儿,大概用个不删除莫队+带撤销并查集就能搞了吧,\(n \sqrt{n} logn\)应该卡的过去 不过不删除莫队咋写来着?....跑去学 ...
- 【离线 撤销并查集 线段树分治】bzoj1018: [SHOI2008]堵塞的交通traffic
本题可化成更一般的问题:离线动态图询问连通性 当然可以利用它的特殊性质,采用在线线段树维护一些标记的方法 Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常 ...
- 【Codeforces576E_CF576E】Painting Edges(可撤销并查集+线段树分治)
题目 CF576E 分析: 从前天早上肝到明天早上qwq其实颓了一上午MC ,自己瞎yy然后1A,写篇博客庆祝一下. 首先做这题之前推荐一道很相似的题:[BZOJ4025]二分图(可撤销并查集+线段树 ...
- 【BZOJ4025】二分图(可撤销并查集+线段树分治)
题目: BZOJ4025 分析: 定理:一个图是二分图的充要条件是不存在奇环. 先考虑一个弱化的问题:保证所有边出现的时间段不会交叉,只会包含或相离. 还是不会?再考虑一个更弱化的问题:边只会出现不会 ...
- 算法笔记--可撤销并查集 && 可持久化并查集
可撤销并查集模板: struct UFS { stack<pair<int*, int>> stk; int fa[N], rnk[N]; inline void init(i ...
- 2019牛客第八场多校 E_Explorer 可撤销并查集(栈)+线段树
目录 题意: 分析: @(2019牛客暑期多校训练营(第八场)E_Explorer) 题意: 链接 题目类似:CF366D,Gym101652T 本题给你\(n(100000)\)个点\(m(1000 ...
- Codeforces 938G 线段树分治 线性基 可撤销并查集
Codeforces 938G Shortest Path Queries 一张连通图,三种操作 1.给x和y之间加上边权为d的边,保证不会产生重边 2.删除x和y之间的边,保证此边之前存在 3.询问 ...
随机推荐
- centos7 安装vmware tool 遇到遇到 kernel-headers 问题修复
安装 vmware tool 步骤 1. cp VMwareTools-10.3.25-20206839.tar.gz 到 用户目录下 2. tar zxf VMwareTools-10.3.25-2 ...
- .Net 6 WebAPI 使用JWT进行 授权认证配置
.Net 6 WebAPI 使用JWT进行 授权认证 1.安装组件(Nuget) Microsoft.AspNetCore.Authentication.JwtBearer 2.Program.cs ...
- Mysql 插入timestamp没有使用默认值问题
在一次升级过程中,发现Mysql插入数据报了个错 Column 'create_time' cannot be null. 但是看了下这个字段虽然是非null,但是是有默认值的 `create_tim ...
- day02---虚拟机上网模式
修改虚拟网络编辑器 虚拟软件网络模式介绍 NAT网络模式 特点:虚拟主机和宿主机网络信息 可以不一致 优点:不容易出现局域网中IP地址冲突 缺点:其它宿主机不能直接访问虚拟机 桥接网络模式 特点:虚拟 ...
- Elasticsearch系列之-windows安装和基础操作
ElasticSearch安装 安装JDK环境 因为ElasticSearch是用Java语言编写的,所以必须安装JDK的环境,并且是JDK 1.8以上 官网:https://www.oracle.c ...
- 记一次WPF集成SemanticKernel+OneAPI+讯飞星火认知大模型实践
开启OneAPI服务 OneAPI介绍 OpenAI 接口管理 & 分发系统,支持 Azure.Anthropic Claude.Google PaLM 2 & Gemini.智谱 C ...
- c# 4.8 实现Windows 定时任务计划(Task Scheduler)
分享一个我自己写的 Windows 定时任务计划(Task Scheduler) 动态创建代码,没做太多封装,留个实现笔记 首先封装一个简单配置项的类 1 public class TaskSched ...
- XILINX SDK烧录FLASH报错不支持旧版hw_server
最近频繁遇到SDK报错,说是不支持hw_server旧版本,此时打开vivado识别的时候也是一样报错,可能原因是我电脑安装了多个版本的VIVADO导致的,那么怎么解决呢? 打开任务管理器,kill ...
- 【Azure 存储服务】Blob中数据通过Stream Analytics导出到SQL/Cosmos DB
问题描述 Json格式的数据目前是存储在Azure Blob中,如何将这些数据Load到Sql DB和CosmosDB中呢? 测试方案 使用Azure流分析服务(Stream Analytics)功能 ...
- [Linux] ubuntu系统使用zfs记录
关于zfs 之前从B站视频里面了解到了btrfs这个文件系统,说是能够实现cow,然后我第一时间觉得这是个极好的特性,结果后来才发现,使用的时候并不多,而且只能通过cp --reflink的方式使用, ...