算法笔记

带权并查集大神详解:https://agatelee.cn/2017/05/%E5%B8%A6%E6%9D%83%E5%B9%B6%E6%9F%A5%E9%9B%86/

贴几道题的代码:

①Poj1182食物链

#include<iostream>
#include<cstdio>
using namespace std;
const int N=1e5+5;
int fa[N],rnk[N];
void Init(int n)
{for(int i=0;i<=n;i++){fa[i]=i;rnk[i]=0;}
}
int Find(int x)
{if(x==fa[x])return x;int temp=fa[x];fa[x]=Find(fa[x]);rnk[x]=(rnk[x]+rnk[temp])%3;return fa[x];
}
void Merge(int r,int x,int y)
{int rx=Find(x);int ry=Find(y);if(rx==ry)return  ;fa[rx]=ry;rnk[rx]=(r+rnk[y]-rnk[x]+3)%3;
}
int main()
{int n,k;cin>>n>>k;Init(n);int ans=0;while(k--){int a,b,c;scanf("%d%d%d",&a,&b,&c);a--;if(b>n||c>n){ans++;continue;}if(a==1&&b==c){ans++;continue;}int rb=Find(b);int rc=Find(c);if(rb!=rc)Merge(a,b,c);else{if((rnk[b]-rnk[c]+3)%3!=a)ans++;}}cout<<ans<<endl;return 0;
}

这道题目不知道为啥用ios::sync_with_stdio(false)和cin是TLE,用ios:cync_with_stdi(false)和scanf()是WA。

详见知乎:用ios::sync_with_stdio(false)有什么坏处

②Hiho 1515分数调查

#include<iostream>
#include<cstdio>
using namespace std;
const int N=1e5+5;
int fa[N],rnk[N];
void Init(int n)
{for(int i=0;i<=n;i++){fa[i]=i;rnk[i]=0;}
}
int Find(int x)
{if(x==fa[x])return x;int temp=fa[x];fa[x]=Find(fa[x]);rnk[x]=rnk[x]+rnk[temp];return fa[x];
}
void Merge(int s,int x,int y)
{int rx=Find(x);int ry=Find(y);if(rx==ry)return  ;fa[rx]=ry;rnk[rx]=s+rnk[y]-rnk[x];
}
int main()
{int n,m,q;cin>>n>>m>>q;Init(n);while(m--){int a,b,c;scanf("%d%d%d",&a,&b,&c);Merge(c,a,b);}while(q--){int a,b;scanf("%d%d",&a,&b);int ra=Find(a);int rb=Find(b);if(ra!=rb)printf("-1\n");else printf("%d\n",rnk[a]-rnk[b]);}return 0;
}

③Codeforces 766D - Mahmoud and a Dictionary

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int fa[N],rnk[N];
map<string,int>ma;
void Init(int n)
{for(int i=0;i<=n;i++){fa[i]=i;rnk[i]=0;}
}
int Find(int x)
{if(x==fa[x])return x;int temp=fa[x];fa[x]=Find(fa[x]);rnk[x]=(rnk[x]+rnk[temp])%2;return fa[x];
}
void Merge(int r,int x,int y)
{int rx=Find(x);int ry=Find(y);if(rx==ry)return;fa[rx]=ry;rnk[rx]=(r+rnk[y]-rnk[x]+2)%2;
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);int n,m,q;cin>>n>>m>>q;Init(n);int a;string s1,s2;for(int i=0;i<n;i++){cin>>s1;ma[s1]=i;}while(m--){cin>>a>>s1>>s2;a--;int rs1=Find(ma[s1]);int rs2=Find(ma[s2]);if(rs1!=rs2){Merge(a,ma[s1],ma[s2]);cout<<"YES"<<endl;}else{if((rnk[ma[s1]]-rnk[ma[s2]]+2)%2!=a)cout<<"NO"<<endl;else cout<<"YES"<<endl;}}while(q--){cin>>s1>>s2;int rs1=Find(ma[s1]);int rs2=Find(ma[s2]);if(rs1!=rs2)cout<<3<<endl;else cout<<((rnk[ma[s1]]-rnk[ma[s2]]+2)%2+1)<<endl;}return 0;
}

ps:

可以用向量的方法考虑rnk之间的变化;

rnk[i] 表示的是i与i直接父亲节点的关系,在没有路径压缩之前不是i与根节点的关系,在路径压缩之后直接父亲就是根节点,此时才是与根节点的关系。所以只需要在直接父亲改变的情况下才需要改变rnk[i]的值。这点也是我最近才考虑清楚的,以前太菜了,没想清楚就以为自己懂了。

转载于:https://www.cnblogs.com/widsom/p/7121629.html

算法笔记--带权并查集及其模板题。相关推荐

  1. 学习笔记——拓展域并查集和带权并查集

    1,拓展域并查集 一般的并查集只能查找出各元素之间是否存在某一种相同的联系,如:a和b是亲戚关系,b和c是亲戚关系,这时就可以查找出a和c也存在亲戚关系.但如果存在多种相对的联系时一般的并查集就不行了 ...

  2. 【无码专区9】序列统计(带权并查集 + 前缀和建边 + dp)

    因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dl ...

  3. 银河英雄传说 ← 带权并查集

    [问题描述] 有一个划分为N列的星际战场,各列依次编号为1,2,-,N. 有N艘战舰,也依次编号为1,2,-,N,其中第i号战舰处于第i列. 有T条指令,每条指令格式为以下两种之一: 1.M i j, ...

  4. 2017乌鲁木齐区域赛I(带权并查集)

    #include<bits/stdc++.h> using namespace std; int f[200010];//代表元 long long rl[200010];//记rl[i] ...

  5. BZOJ 2303 方格染色(带权并查集)

    要使得每个2*2的矩形有奇数个红色,如果我们把红色记为1,蓝色记为0,那么我们得到了这2*2的矩形里的数字异或和为1. 对于每个方格则有a(i,j)^a(i-1,j)^a(i,j-1)^a(i-1,j ...

  6. POJ1703带权并查集(距离或者异或)

    题意:       有两个黑社会帮派,有n个人,他们肯定属于两个帮派中的一个,然后有两种操作 1 D a b 给出a b 两个人不属于同一个帮派 2 A a b 问a b 两个人关系 输出 同一个帮派 ...

  7. POJ1988(带权并查集,搬砖块)

    题意:        可以这样理解,有n快方形积木,一开始都是单独的放到哪,然后有两种操作 1 M a b 把a所在的那一堆落到b所在那一堆的上面(一开始自己是一堆) 2 C a 问a下面有多少个积木 ...

  8. LA3027简单带权并查集

    题意:       有n个点,一开始大家都是独立的点,然后给出一些关系,a,b表示a是b的父亲节点,距离是abs(a-b)%1000,然后有一些询问,每次询问一个节点a到父亲节点的距离是多少? 思路: ...

  9. hdu3234 带权并查集(XOR)

    题意:       给你n个未知的正整数,有三总操作       I P V            P的值是V       I P Q V          P XOR Q = V       Q K ...

  10. hdu4829 带权并查集(题目不错)

    题意: Information Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...

最新文章

  1. react-native 小米手机和 mac 安装
  2. 开发日记-20190723 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 13
  3. 【转】Linux入门命令篇(简训)
  4. 【数学和算法】如何理解特征值为复数的情况
  5. Linux下怎么创建和进入带有空格的文件夹
  6. mysql免安装出现1067_mysql,免安装,1067错误
  7. 微信公众号可以开店吗?
  8. Robocopy用法
  9. sin35度等于多少怎么用计算机算,sin35度等于多少_tan35°等于几分之几
  10. 超宽带 DWM1000模块 简介
  11. “易班”学生管理平台小项目 万字总结 泪目!!!
  12. 【软考系统架构设计师】2014年下系统架构师案例分析历年真题
  13. esxi添加硬盘驱动
  14. ycf 梗_抖音三个汤勺放在筷子上是什么梗 抖音三个汤勺放在筷子上出处介绍[多图]...
  15. 汽车的一些简写名词(后续会继续更新)
  16. Coprime AtCoder Beginner Contest 215
  17. 人工智能-概述:数据分析---->人工智能【机器学习----->深度学习】
  18. 贴片加工厂家讲解__ICT是什么?主要测试什么?ICT测试的优缺点?
  19. 如何在Windows 7中获得快速,强大的XP风格的搜索
  20. 关于Android的字体

热门文章

  1. 走心!15年程序员老兵的40条编程技巧,先收藏了!
  2. python查看系统句柄数量_查看Linux某个进程打开的文件句柄(file descriptor)数量...
  3. 本机mysql无法进行碎片整理有什么用,试试mysql数据碎片整理吧解决astgo经常死机变慢的问题...
  4. 修改Linux文件的读写权限
  5. Selenium爬虫 -- 操控滚动条方法
  6. ie手机浏览器_最终还是说再见!微软宣布重要消息,IE浏览器被放弃
  7. 自学TP5源码(一)
  8. Mongoose使用——nodejs结合mongodb
  9. 遗传算法的基本概念和实现(附 Java 实现案例)
  10. PreparedStatement批量处理和事务