代码一(正确的):
#include<iostream>
using namespace std;
int parent[2005];
int find(int k) {
if(k==parent[k])
return k;
return parent[k]=find(parent[k]);
}
void combine(int a,int b) {
parent[find(a)]=find(b);
}
int main() {
int n,m,ans=0;
cin>>n>>m;
for(int i=1;i<=2*n;i++)
parent[i]=i;
for(int i=1;i<=m;i++) {
char a;
int x,y;
cin>>a>>x>>y;
if(a=='F') combine(x,y);
else {
combine(x+n,y);
combine(y+n,x);//这一行
}
}
for(int i=1;i<=n;i++)
if(parent[i]==i)
ans++;
cout<<ans;
}
代码二(错的):
#include<iostream>
using namespace std;
int parent[2005];
int find(int k) {
if(k==parent[k])
return k;
return parent[k]=find(parent[k]);
}
void combine(int a,int b) {
parent[find(a)]=find(b);
}
int main() {
int n,m,ans=0;
cin>>n>>m;
for(int i=1;i<=2*n;i++)
parent[i]=i;
for(int i=1;i<=m;i++) {
char a;
int x,y;
cin>>a>>x>>y;
if(a=='F') combine(x,y);
else {
combine(x+n,y);
combine(x,y+n);//这一行
}
}
for(int i=1;i<=n;i++)
if(parent[i]==i)
ans++;
cout<<ans;
}
求大佬解答为什么那两行反过来就错了