关键词:
题号:ZHOJ1258
思路:并查集。
给每个人建立一个“正集”(朋友)、一个“反集”(敌人),反集要么为空、要么指向一个正集,维护这两类集合,最后统计“正集”的个数。
1 #include<cstdio> 2 #include<cstring> 3 const int N=1000; 4 int ans; 5 class UnionFindSet { 6 private: 7 int anc[N],anti[N]; 8 public: 9 UnionFindSet(int n) { 10 for(int i=0;i<=n;i++) { 11 anc[i]=i; 12 anti[i]=0; 13 } 14 } 15 int Find(int x) { 16 return (x==anc[x])?x:(anc[x]=Find(anc[x])); 17 } 18 void Union(int op,int x,int y) { 19 if(op==1) { 20 if(Find(y)==Find(x)) return; 21 anc[Find(y)]=Find(x); 22 } 23 if(op==2) { 24 if(anti[x]) Union(1,anti[x],y); 25 if(anti[y]) Union(1,anti[y],x); 26 if(!anti[x]) anti[x]=Find(y); 27 if(!anti[y]) anti[y]=Find(x); 28 } 29 } 30 int Count(int n) { 31 bool vis[n+1]; 32 memset(vis,0,sizeof vis); 33 for(int i=1;i<=n;i++) vis[Find(i)]=true; 34 int ans=0; 35 for(int i=1;i<=n;i++) if(vis[i]) ans++; 36 return ans; 37 } 38 }; 39 int main() { 40 int n,m; 41 scanf("%d%d",&n,&m); 42 UnionFindSet s(n); 43 while(m--) { 44 int op,x,y; 45 scanf("%d%d%d",&op,&x,&y); 46 s.Union(op,x,y); 47 } 48 printf("%d ",s.Count(n)); 49 return 0; 50 }
团伙(并查集经典)
题目大体的说:1.我朋友的朋友是我的朋友; 2.我敌人的敌人是我的朋友;所有是朋友的人组成一个团伙。告诉你关于这N个人的M条信息,即某两个人是朋友,或者某两个人是敌人,请你编写一个程序,计算出这个城市最多可... 查看详情
并查集bzoj1370-[baltic2003]gang团伙
【题目大意】在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足:1、我朋友的朋友是我的朋友;2、我敌人的敌人是我的朋友;所有是朋友的人组成一个团伙。告诉你关于这n个人的m条信息,即某两个人是朋... 查看详情
续并查集学习笔记——gang团伙题解
一言不合先贴题目Description在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足:1、我朋友的朋友是我的朋友;2、我敌人的敌人是我的朋友;所有是朋友的人组成一个团伙。告诉你关于这n个人的m条信息,即... 查看详情
动规(18)-并查集基础题——团伙
在某城市里住着N个人,任何两个认识的人不是朋友就是敌人,而且满足: 1、 我朋友的朋友是我的朋友; 2、 我敌人的敌人是我的朋友;所有是朋友的人组成一个团伙。告诉你关于这N个人的M条信息... 查看详情
bzoj1370[baltic2003]gang团伙:并查集虚点
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1370题意: 在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足: (1)我朋友的朋友是我的朋友。 (2)我敌人的敌人是我的朋友。 所... 查看详情
p1892[boi2003]团伙并查集(代码片段)
题目描述1920年的芝加哥,出现了一群强盗。如果两个强盗遇上了,那么他们要么是朋友,要么是敌人。而且有一点是肯定的,就是:我朋友的朋友是我的朋友;我敌人的敌人也是我的朋友。两个强盗是同一团伙的条件是当且仅... 查看详情
动规(18)-并查集基础题——团伙(代码片段)
在某城市里住着N个人,任何两个认识的人不是朋友就是敌人,而且满足: 1、 我朋友的朋友是我的朋友; 2、 我敌人的敌人是我的朋友;所有是朋友的人组成一个团伙。告诉你关于这N个人的M条信息... 查看详情
动规(18)-并查集基础题——团伙(代码片段)
在某城市里住着N个人,任何两个认识的人不是朋友就是敌人,而且满足: 1、 我朋友的朋友是我的朋友; 2、 我敌人的敌人是我的朋友;所有是朋友的人组成一个团伙。告诉你关于这N个人的M条信息... 查看详情
动规(20)-并查集基础题——打击犯罪(代码片段)
【问题描述】 某个地区有n(n<=1000)个犯罪团伙,当地警方按照他们的危险程度由高到低给他们编号为1-n,他们有些团伙之间有直接联系,但是任意两个团伙都可以通过直接或间接的方式联系,这样这里就形... 查看详情
动规(20)-并查集基础题——打击犯罪(代码片段)
【问题描述】 某个地区有n(n<=1000)个犯罪团伙,当地警方按照他们的危险程度由高到低给他们编号为1-n,他们有些团伙之间有直接联系,但是任意两个团伙都可以通过直接或间接的方式联系,这样这里就形... 查看详情
动规(20)-并查集基础题——打击犯罪(代码片段)
【问题描述】 某个地区有n(n<=1000)个犯罪团伙,当地警方按照他们的危险程度由高到低给他们编号为1-n,他们有些团伙之间有直接联系,但是任意两个团伙都可以通过直接或间接的方式联系,这样这里就形... 查看详情
bzoj1370:[baltic2003]gang团伙(luogu1892)(种类并查集)(代码片段)
...吧 https://www.luogu.org/problemnew/show/P1892题解: 种类并查集。。 因为有敌人的敌人是朋友这个条件,所以需要一个中转点。。 因此,将每个点拆成两个点,一个是朋友点,另一个是敌人点。当读到A与B是朋友时,就将... 查看详情
并查集的一般操作③
RT 题目描述 1920年的芝加哥,出现了一群强盗。如果两个强盗遇上了,那么他们要么是朋友,要么是敌人。而且有一点是肯定的,就是: 我朋友的朋友是我的朋友; 我敌人的敌人也是我的朋友。 两个强盗是同... 查看详情
并查集
并查集是一个非常非常简单,好背,但不好理解的题目,但只要理解了,闭着眼都能打出来,当然我也因为这个困扰了好长时间,接下来我给大家说说并查集支持的许多操作。1:找爸爸(find)不要在意名字,这不是帮你理解吗... 查看详情
[洛谷p1892]团伙
...人就不在,现在给出一关系,问最多有多少团伙。题解:并查集,建反集,如果是朋友,就把他们的并查集合并;如果是敌人,就把他们分别和对方的反集合并,统计最后有几个联通块C++Code:#include<cstdio>usingnamespacestd;constin... 查看详情
[qbzt寒假]并查集(代码片段)
并查集:(Kruscal),(Tarjan)求(LCA)分类并查集:食物链,团伙(敌人的敌人是我的朋友)带权并查集:(SDOI2016)齿轮(可用intfather(intx)returnfa[x]==x?x:fa[x]=father(f[x]);Luogu3101滑雪等级[]建边:任意相邻两格子之间建边,权值为海拔差将边... 查看详情
❤️数据结构入门❤️(2-5)-并查集
文章目录一、并查集的定义二、并查集的图解三、并查集的实现1、并查集的插入2、并查集的删除3、并查集的修改4、并查集的查找四、并查集的刷题实战一、并查集的定义二、并查集的图解三、并查集的实现1、并查集的插入2、... 查看详情
并查集
并查集1.并查集是什么并查集是一种用来管理元素分组情况的数据结构。并查集可以高效地进行如下操作。不过需要注意并查集虽然可以进行合并操作,但是无法进行分割操作。查询元素a和元素b是否属于同一组。合并元素a和元... 查看详情