团伙(并查集经典)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了团伙(并查集经典)相关的知识,希望对你有一定的参考价值。
题目大体的说:
1.我朋友的朋友是我的朋友;
2.我敌人的敌人是我的朋友;
所有是朋友的人组成一个团伙。告诉你关于这N个人的M条信息,即某两个人是朋友,或者某两个人是敌人,请你编写一个程序,计算出这个城市最多可能有多少个团伙?
方法:
1 #include<cstdio> 2 #include<cstring> 3 long n,m,x,y,re=0,b,r1,r2; 4 long father[1001],a[1001][1001]; 5 long find (long); 6 int main() 7 { 8 memset(a,0,sizeof(a)); 9 scanf("%d %d",&n,&m); 10 for(int i=1;i<=n;i++) 11 father[i]=i; 12 for(int i=1;i<=m;i++) 13 { 14 scanf("%d %d %d",&b,&x,&y); 15 if(b==0) 16 { 17 r1=find(x); 18 r2=find(y); 19 father[r2]=r1; 20 } 21 if(b==1) 22 for(int j=1;j<=a[x][0];j++) 23 { 24 r1=find(y); 25 r2=find(a[x][j]); 26 father[r2]=r1; 27 } 28 for(int j=1;j<=a[y][0];j++) 29 { 30 r1=find(x); 31 r2=find(a[y][j]); 32 father[r2]=r1; 33 } 34 a[x][0]++; 35 a[y][0]++; 36 a[x][a[x][0]]=y; 37 a[y][a[y][0]]=x; 38 } 39 for(int i=1;i<=n;i++) 40 if(father[i]=i) 41 re++; 42 printf("%d",re); 43 } 44 long find(long x) 45 { 46 if(father[x]!=x) 47 father[x]=find(father[x]); 48 return father[x]; 49 }
以上是关于团伙(并查集经典)的主要内容,如果未能解决你的问题,请参考以下文章
Luogu P2024&P1892食物链&团伙(并查集拓展域)