博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P1196 [NOI2002]银河英雄传说
阅读量:5073 次
发布时间:2019-06-12

本文共 1126 字,大约阅读时间需要 3 分钟。

并查集

起初我也不懂,后来是看了题解才懂的

感谢

 

尽力讲清楚吧..

带权并查集..

并查集在路径压缩时顺带把并查集上的边权也压缩

设 sum[i] 表示船 i 前面有多少船,不包括 i

求两船之间有多少船,只要把后面的sum减去前面的sum

#include
#include
#include
using namespace std;inline int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f;}int n;int fa[30007],sum[30007],sz[30007]; //sz[i]表示船i所在的行队列的大小inline int find(int x){ if(fa[x]==x) return x; int k=fa[x]; fa[x]=find(fa[x]);//先更新前面的船的sum和sz sum[x]+=sum[k];    //利用前面的信息更新当前信息,注意是"+=sum[k]",因为之前可能也压缩过(即x和k之间可能隔着船) sz[x]=sz[fa[x]];//更新sz return fa[x];}//并查集带权路径压缩(核心代码)int main(){ for(int i=1;i<=30005;i++) fa[i]=i,sz[i]=1;//初始化 int a,b; char ch; cin>>n; while(n--) { cin>>ch; a=read(); b=read(); if(ch=='M') { int xa=find(a),xb=find(b); //cout<
<<" "<
<

 

转载于:https://www.cnblogs.com/LLTYYC/p/9522890.html

你可能感兴趣的文章
Scaling Pinterest - From 0 To 10s Of Billions Of Page Views A Month In Two Years
查看>>
SelectSort 选择排序
查看>>
关于android 加载https网页的问题
查看>>
BZOJ 1047 HAOI2007 理想的正方形 单调队列
查看>>
各种语言推断是否是手机设备
查看>>
这个看起来有点简单!--------实验吧
查看>>
小知识:js如何更改css样式
查看>>
PHP count down
查看>>
JVM参数调优:Eclipse启动实践
查看>>
(旧笔记搬家)struts.xml中单独页面跳转的配置
查看>>
不定期周末福利:数据结构与算法学习书单
查看>>
strlen函数
查看>>
Java中的String,StringBuilder,StringBuffer三者的区别
查看>>
Python爬虫
查看>>
python的列表与shell的数组
查看>>
关于TFS2010使用常见问题
查看>>
软件工程团队作业3
查看>>
python标准库——queue模块 的queue类(单向队列)
查看>>
火狐、谷歌、IE关于document.body.scrollTop和document.documentElement.scrollTop 以及值为0的问题...
查看>>
深入理解JVM读书笔记--字节码执行引擎
查看>>