社区讨论

求大佬解答为什么反过来就错了

学术版参与者 2已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lo8ss9c1
此快照首次捕获于
2023/10/27 23:58
2 年前
此快照最后确认于
2023/10/27 23:58
2 年前
查看原帖
代码一(正确的):
CPP
#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;
}
代码二(错的):
CPP
#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;
}
求大佬解答为什么那两行反过来就错了

回复

5 条回复,欢迎继续交流。

正在加载回复...