并查集笔记
代码实现:
通过路径压缩把某类节点统统并入根节点,类似于冠状病毒(?
首先把每个节点的父节点设置为他们自己
find函数以及修改父节点代码实现
int findset(int n){ return fa[n]==n?n:fa[n]=findset(fa[n]); }
并查集父节点查询与融合操作
int fx=findset(x),fy=findset(y); if(fx==fy) continue;//父节点相同说明在同一区间内 fa[fx]=fy;
启发式合并:额外增加一个siz数组记录在父节点为i的情况下,子节点的个数,当两个区域融合时,让子节点个数少的区域优先被修改
int fx=findset(x),fy=findset(y); if(fx==fy) continue; if(siz[x]>siz[y])\\保证fx<fy swap(fx,fy); fa[fx]=fy; siz[fy]+=siz[fx];
例题:行进路线 - 题目 - Daimayuan Online Judge
#pragma GCC optimize(2) #pragma GCC optimize(1) #include<bits/stdc++.h> typedef long long ll; typedef unsigned long long ull; const ull base=131; #define MAX 1009 #define PI 3.141592653589793 using namespace std; ll node[MAX][3],fa[MAX]; int findset(int n){ return fa[n]==n?n:fa[n]=findset(fa[n]); } inline void solve(){ ll xe,ye;cin>>xe>>ye; int time;cin>>time; for(int i=1;i<=time;i++){ cin>>node[i][0]>>node[i][1]>>node[i][2]; } for(int i=0;i<time;i++) fa[i]=i; node[0][0]=0;node[0][1]=0;node[0][2]=1; for(int i=0;i<=time;i++) for(int j=i+1;j<=time;j++){ if((node[i][0]-node[j][0])*(node[i][0]-node[j][0])+(node[i][1]-node[j][1])*(node[i][1]-node[j][1])<=(node[i][2]+node[j][2])*(node[i][2]+node[j][2])){ int fx=findset(i),fy=findset(j); if(fx==fy) continue; fa[fy]=fx; } } int dex=-1; for(int i=0;i<=time;i++){ if((node[i][0]-xe)*(node[i][0]-xe)+(node[i][1]-ye)*(node[i][1]-ye)<=node[i][2]*node[i][2]) dex=i; } if(dex!=-1&&findset(0)==findset(dex)) cout<<1<<endl; else cout<<0<<endl; } int main() { std::ios::sync_with_stdio(false); std::cin.tie(0); int sum;cin>>sum; while(sum--){ solve(); } }
分类:
数据结构
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义