【题目描述】
在某城市里住着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
【来源】
+n代表敌人的敌人
以样例为例 1 4为敌人,则unionn(7,4) unionn(1,10),1 2为敌人,则unionn(7,2) unionn(1,8),这样通过7可以使4和2成为朋友,达到敌人的敌人就是朋友的目的。
这题数要开大点,要不然测试点个过不完
代码用了自己的
#include<bits/stdc++.h>
using namespace std;
int pre[2020];
int vis[2020];
int findR(int root1){
int son,tmp;
son=root1;
while(root1!=pre[root1]){
root1=pre[root1];
}
while(son!=root1){
tmp=pre[son];
pre[son]=root1;
son=tmp;
}
return root1;
}
void unionn(int root1,int root2){
int x,y;
x=findR(root1);
y=findR(root2);
if(x!=y){
pre[x]=y;
}
}
int main(){
int n,m;
int p,x,y;
int total;
cin>>n>>m;
total=0;
for(int i=1;i<=n*2;i++) pre[i]=i;
while(m--){
cin>>p>>x>>y;
if(p==0) unionn(x,y);
else {
unionn(x+n,y);
unionn(x,y+n);
}
}
for(int i=1;i<=n;i++){
int temp=findR(i);
if(!vis[temp]){
vis[temp]=1;
total++;
}
}
cout<<total;
return 0;
}