当前位置: 首页 > news >正文

011.并查集

并查集

#include<vector>
using namespace std;class UnionFind{vector<int>fa;public://初始化UnionFind(int n):fa(n){for(int i=0;i<n;i++)fa[i]=i;}//查找父节点int find(int x){if(x!=fa[x])return fa[x]=find(fa[x]);//路径压缩return fa[x];}void merge(int a,int b){int A=find(a);int B=find(b);if(A!=B)fa[A]=B;//避免成环}bool check(int a,int b){return find(a)==find(b);}
};

一道例题

Input
5 5 6
1 2
2 3
2 4
2 5
4 5
3
1 1 2
3
2 1 2
1 2 4
2 2 4Output 
0
1
NO
YES

观察数据范围,得知我们需要离线处理

先读入所有边和所有操作

初始建图 :连上那些永远不会被删的边

倒着处理所有操作,维护连通分量数目cnt

收集答案,最后倒着输出答案

操作 3 :ans = 连通分量(cnt) - 1

操作 2 :查询连通

操作 1 :连接 x , y 连通成功 cnt --

#include<bits/stdc++.h>
using namespace std;
namespace IO{template<typename T>void read(T&x){x=0;bool f=0;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}if(f)x=-x;}void read(char&c){c=getchar();while(isspace(c))c=getchar();}void read(string&s){s.clear();char ch=getchar();while(isspace(ch))ch=getchar();while(!isspace(ch)&&ch!=EOF){s+=ch;ch=getchar();}}template<typename T,typename...Args>void read(T&first,Args&...rest){read(first);read(rest...);}template<typename T>void wr(T x){if(x==0){putchar('0');return;}if(x<0){putchar('-');x=-x;}char stk[20];int top=0;while(x){stk[++top]=x%10+'0';x/=10;}while(top){putchar(stk[top--]);}}void wr(const char c){putchar(c);}void wr(const string&s){for(char c:s)putchar(c);}void wr(const char*s){while(*s)putchar(*s++);}template<typename T>void wr(const T&x,char sep){wr(x);putchar(sep);}template<typename T,typename...Args>void wr(const T&first,const Args&...rest){wr(first);((putchar(' '),wr(rest)),...);}}using namespace IO;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const int MOD=1000000007;
const int INF=0x3f3f3f3f;
const int MAXN=100005;
class UnionFind{vector<int>fa;public://初始化UnionFind(int n):fa(n){for(int i=0;i<n;i++)fa[i]=i;}//查找父节点int find(int x){if(x!=fa[x])return fa[x]=find(fa[x]);//路径压缩return fa[x];}void merge(int a,int b){int A=find(a);int B=find(b);if(A!=B)fa[A]=B;//避免成环}bool check(int a,int b){return find(a)==find(b);}
};
void solve(){int n,m,q;read(n,m,q);vector<pii>e;map<pii,int>de;int mode,u,v;for(int i=0;i<m;++i){read(u,v);u--,v--;if(u>v)swap(u,v);e.push_back({u,v});de[{u,v}]=INF;}vector<pair<int,pii>>op(q);for(int i=0;i<q;++i){read(mode);op[i].first=mode;if(mode!=3){read(u,v);u--,v--;if(u>v)swap(u,v);op[i].second={u,v};if(mode==1)de[{u,v}]=i;}}UnionFind UF(n);int cnt=n;for(auto &x:e){if(de[x]==INF){u=x.first;v=x.second;if(!UF.check(u,v))cnt--;UF.merge(u,v);}}vector<int>ans;for(int i=q-1;i>=0;i--){u=op[i].second.first;v=op[i].second.second;if(op[i].first==3)ans.push_back(cnt-1);else if(op[i].first==2){if(UF.check(u,v))ans.push_back(-101);else ans.push_back(-100);}else{if(!UF.check(u,v))cnt--;UF.merge(u,v);}}for(int i=ans.size()-1;i>=0;i--){int x=ans[i];if(x==-101)wr("YES\n");else if(x==-100)wr("NO\n");else wr(x,'\n');}
}
int main(){int T=1;//read(T);while(T--){solve();}
}
http://www.jsqmd.com/news/94929/

相关文章:

  • 49周作业
  • Miniconda环境导出与导入:实现团队协作无缝对接
  • 07FlyLTAS旅行社ERP散客滚动发团操作流程说明
  • 使用Ollama运行Seed-Coder-8B-Base:轻量级代码生成解决方案
  • 07FlyLTAS旅行社ERP散客行程分团状态说明
  • Conda虚拟环境配置Qwen-Image-Edit-2509全流程教程
  • 第六章-元素绑定
  • Labview实现四工位相机同时扫二维码、HTTP协议Mes上传及汇川PLC通讯协议
  • 2026毕设ssm+vue基于的作业管理系统论文+程序
  • 【自然语言处理】自然语言处理中数据集的开发与测试:从基础划分到稳健评估的全维度实践
  • 关于浔川 AI 翻译项目推进建议的公告
  • 如何将gpt-oss-20b封装成REST API供外部调用
  • 滚动轴承缺陷动力学模型:从理论到实践
  • Halcon条码技术详解(含 Halcon 应用示例)
  • 【ACWing】111. 畜栏预定
  • GG3M (鸽姆) Global Governance Meta-Mind Model: 商业计划书 Global Civilization Governance OS (Eastern Wisdom
  • C#+VisionMaster联合开发控件篇(八)_参数配置带渲染窗体
  • 线性表之顺序栈
  • Fedora , Linux 创始人 Linus 的选择 —— 目前他生活在加拿大
  • 基于springboot的药店药品管理系统的设计与实现(源码+lw+远程部署)
  • groovy基础了解
  • 深度解析 Google JAX 全栈:带你上手开发,从零构建神经网络
  • 基于python的药店药品管理系统的设计与实现(源码+lw+远程部署)
  • 2026毕设ssm+vue基于高校新生报到论文+程序
  • 金融数据分析-申万行业数据分析系统(Python+Streamlit)
  • 百度搜索不到的Qwen3-VL-8B安装包获取渠道揭秘
  • 影刀使用全局附值控制操作次数
  • CTF —— 网络安全大赛!从入门到精通,收藏这篇就够了
  • ENSP抓包分析Qwen3-VL-30B API通信协议细节
  • Stm32_2:蜂鸣器、按键、继电器