1385:团伙(group)
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足:
1、我朋友的朋友是我的朋友;
2、我敌人的敌人是我的朋友;
所有是朋友的人组成一个团伙。告诉你关于这n个人的m条信息,即某两个人是朋友,或者某两个人是敌人,请你编写一个程序,计算出这个城市最多可能有多少个团伙?
【输入】
第1行为n和m,1<n<1000,1<=m<=100 000;
以下m行,每行为p x y,p的值为0或1,p为0时,表示x和y是朋友,p为1时,表示x和y是敌人。
【输出】
一个整数,表示这n个人最多可能有几个团伙。
【输入样例】
6 4
1 1 4
0 3 5
0 4 6
1 1 2
【输出样例】
3
1. //示例代码 2. #include <bits/stdc++.h> 3. using namespace std; 4. int n,m,p,x,y,ans; 5. int father[1010],enemy[1010]; 6. int find(int x){//查找根 7. if(father[x]!=x) father[x]=find(father[x]); 8. return father[x]; 9. } 10. void unionn(int x,int y){//合并 11. int a=find(x); 12. int b=find(y); 13. father[a]=b; 14. } 15. int main() { 16. cin>>n>>m; 17. for(int i=1;i<=n;i++) father[i]=i;//初始化每个人都是自己的团伙头 18. for(int i=1;i<=m;i++){ 19. cin>>p>>x>>y; 20. if(p==0) unionn(x,y);//朋友合并 21. else { 22. if(enemy[x]==0) enemy[x]=y;//无敌人则建立敌人 23. else unionn(enemy[x],y);//已有敌人 敌人和敌人是朋友 24. if(enemy[y]==0) enemy[y]=x;//无敌人则建立敌人 25. else unionn(enemy[y],x);//已有敌人 敌人和敌人是朋友 26. } 27. } 28. for(int i=1;i<=n;i++) 29. if(father[i]==i) ans++;//统计每个团伙的头有几个 30. cout<<ans; 31. return 0; 32. }