正题

题目链接:https://www.luogu.com.cn/problem/CF891C


题目大意

nnn个点mmm条边的一张无向联通图,每次询问一个边集能否同时出现在同一棵最小生成树上。

1≤n,m,q,wi,∑k≤5×1051\leq n,m,q,w_i,\sum k\leq 5\times 10^51≤n,m,q,wi​,∑k≤5×105


解题思路

考虑KruskalKruskalKruskal的做法,每次找一条最小的边然后判断是否能够加入最小生成树。

考虑到边权相同的边可以任意排序,我们把它称之为同一层的边,并且无论任意排序最后产生的图的连通情况都不会改变。

我们把一个询问的边按照边分层,那么每层的边都合法这个询问就合法。

然后对于一个询问同一层的边,直接离线,然后把前面的层都加入之后,再把所有这些询问边加入判断是否合法即可。因为前面的层不能重新插,所以做完要撤销回去。

时间复杂度:O(nlog⁡n)O(n\log n)O(nlogn)(全部同级的话)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<stack>
using namespace std;
const int N=5e5+10;
struct node{int x,y,w;
}e[N],b[N];
int n,m,Q,k,cnt,fa[N],dep[N],mk[N];
bool ans[N];
vector<node> q[N];
vector<int> h[N];
stack<node> cl;
int find(int x)
{return (fa[x]==x)?x:find(fa[x]);}
void unionn(int x,int y){if(dep[x]>dep[y])swap(x,y);cl.push((node){x,y,dep[y]});fa[x]=y;dep[y]=max(dep[y],dep[x]+1);return;
}
bool cmp(node x,node y)
{return x.w<y.w;}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=m;i++)scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].w);scanf("%d",&Q);for(int i=1;i<=Q;i++){int k;scanf("%d",&k);for(int j=1,x;j<=k;j++)scanf("%d",&x),b[j]=e[x];sort(b+1,b+1+k,cmp);ans[i]=1;for(int j=1;j<=k;j++){if(b[j].w!=b[j-1].w)++cnt,h[b[j].w].push_back(cnt),mk[cnt]=i;q[cnt].push_back(b[j]);}}sort(e+1,e+1+m,cmp);for(int i=1;i<=n;i++)fa[i]=i;for(int l=1,r=1;l<=m;l=r+1){while(e[r+1].w==e[l].w)r++;int w=e[l].w;while(!cl.empty())cl.pop();for(int j=0;j<h[w].size();j++){int p=h[w][j];for(int i=0;i<q[p].size();i++){int x=q[p][i].x,y=q[p][i].y;x=find(x);y=find(y);if(x==y){ans[mk[p]]=0;break;}unionn(x,y);}while(!cl.empty()){node x=cl.top();cl.pop();dep[x.y]=x.w;fa[x.x]=x.x;}}for(int i=l;i<=r;i++){int x=find(e[i].x),y=find(e[i].y);if(x==y)continue;unionn(x,y);}}for(int i=1;i<=Q;i++)if(ans[i])puts("YES");else puts("NO");return 0;
}

CF891C-Envy【可撤销并查集】相关推荐

  1. CodeForces - 892E Envy(可撤销并查集)

    题目链接:点击查看 题目大意:给出一张由 n 个点 m 条边组成的连通图,有 q 次询问,每次询问给出一个边集,需要判断这些边是否可以同时出现在最小生成树上 题目分析:需要用到的一个性质是,对于同一个 ...

  2. 线段树分治 ---- F. Extending Set of Points(线段树分治 + 可撤销并查集)

    题目链接 题目大意: 你有个点集合SSS,每次往集合里面加点或者删点(如果要加的点出现过),如果(x1,y1),(x2,y1),(x1,y2),(x2,y2)(x1,y1),(x2,y1),(x1,y ...

  3. 线段树分治 ---- CF1217F - Forced Online Queries Problem(假离线 可撤销并查集 + 线段树分治)详解

    题目链接 题目大意 解题思路: 我一开始想到可以用可撤销并查集去维护这种删边加边的操作,但是有个缺点是每次撤销都有把后面的边全部撤销复度是O(n2)O(n^2)O(n2) 首先我们考虑这种动态加边删边 ...

  4. 洛谷P7518:宝石(倍增、可撤销并查集)

    解析 算法一 定义 upx,kup_{x,k}upx,k​ 为节点 xxx 从自己的颜色所在位置在返祖链上往后跳 2k2^k2k 个颜色到达的节点. 可以像倍增一样的求解. 这样对于一次询问 (s,t ...

  5. CF603E-Pastoral Oddities【CDQ分治,可撤销并查集】

    正题 题目链接:https://www.luogu.com.cn/problem/CF603E 题目大意 开始时有nnn个点,没有边. 依次加入mmm条带权的边,每次加入后询问是否存在一个边集,满足每 ...

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

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

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

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

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

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

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

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

  10. 图论 + 并查集 ----最小生成树重构图 + 可撤销并查集 + set启发式合并 时间线上的离线求解 D. Graph and Queries

    解题思路 题目大意: 就是给你一个无向图,每个点都有一个权值,和qqq次询问 每次询问有两种操作 1 x:就询问从x点出发,能访问到的最大权值是多少,并把最大权值那个点的权值设置为0 2 x:就是删除 ...

最新文章

  1. pyqt5 QMainWindow 居中
  2. 【温故知新】CSS学习笔记(样式表)
  3. 【图像超分辨率】Multi-scale Residual Network for Image Super-Resolution
  4. java 私有变量访问_Java - 访问私有实例变量
  5. java中为什么使用上转型和下转型
  6. C#-类-string/Manth/Random/DateTime-及练习
  7. mysql根据经纬度查询范围内数据,并根据距离排序
  8. java中fork函数_java中的forkjoin框架的使用
  9. ajax连接前后端原理,前后端数据交互方法和原理
  10. nginx做负载CDN加速获取端真实ip
  11. linux上验证cudnn是否安装成功_Ubuntu 18.04安装CUDA(版本10.2)和cuDNN
  12. Check Point截获JavaScript文件隐形攻击
  13. iOS 关于单例那点事
  14. js室内地图开发_支付宝小程序室内地图导航开发-支付宝小程序JS加载esmap地图...
  15. 联合利华在天津成立植卓肉匠亚洲研发中心;第129届广交会在云端圆满落幕 | 美通企业日报
  16. 用上这个神器后,广告从此去无忧!(全平台免费支持,无需安装任何客户端软件)...
  17. 寒冬,送点社区温暖。
  18. 八、基于FPGA的以太网协议介绍(二)
  19. 推荐几款性价比高的优盘
  20. Vue UI组件 开发框架 服务端 辅助工具 应用实例 Demo示例

热门文章

  1. vue 一个页面有点请求需要同时发送_前端性能优化,这些你都需要知道
  2. python中random什么意思_python中的random
  3. python大型项目中的日志模块_Python中日志模块的使用
  4. 计算机基础知识教案1,计算机基础知识教案一
  5. bms中soh计算方式_BMS算法设计之电池SOH介绍(下)
  6. 算法设计与分析——分支限界法——装载问题
  7. 算法设计与分析——回溯法——批处理作业调度
  8. 7-51 两个有序链表序列的合并 (20 分)(vector做法)
  9. 10分钟带你探索css中更为奇妙的奥秘
  10. [mybatis]缓存_一级缓存_一级缓存失效的四种情况