虽然我AC了,但是我还是有一些疑惑。希望有大佬指点
查看原帖
虽然我AC了,但是我还是有一些疑惑。希望有大佬指点
182766
吴彬……楼主2021/8/25 14:19
#include<bits/stdc++.h>
using namespace std;
int n,m,ans;
int dr[1010],fa[1010];
bool flag[1010];
int getf(int x){
//	cout<<x<<" "<<fa[x]<<endl; 
	if(fa[x]==x) return x;
	return fa[x]=getf(fa[x]);
}
int main(){
	cin>>n>>m;
	char c;
	int x,y;
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<=m;i++){
		cin>>c>>x>>y;
		if(c=='F')
			fa[getf(x)]=getf(y);
		else {
			if(!dr[x]) dr[x]=y;
			else fa[getf(y)]=fa[getf(dr[x])];
			if(!dr[y]) dr[y]=x;
			else fa[getf(x)]=fa[getf(dr[y])];
		}
	}
	for(int i=1;i<=n;i++)
		flag[getf(i)]=1;
	for(int i=1;i<=n;i++)
		if(flag[i]) ans++;
	cout<<ans;
	return 0;
}

这个是AC代码。

#include<bits/stdc++.h>
using namespace std;
int n,m,ans;
int dr[1010],fa[1010];
bool flag[1010];
int getf(int x){
	if(fa[x]==x) return x;
	return fa[x]=getf(fa[x]);
}
int main(){
	cin>>n>>m;
	char c;
	int x,y;
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<=m;i++){
		cin>>c>>x>>y;
		if(c=='F')
			fa[getf(x)]=getf(y);
		else {
			if(!dr[x]) dr[x]=y;
			else fa[getf(y)]=dr[x];
			if(!dr[y]) dr[y]=x;
			else fa[getf(x)]=dr[y];
		}
	}
	for(int i=1;i<=n;i++)
		flag[getf(i)]=1;
	for(int i=1;i<=n;i++)
		if(flag[i]) ans++;
	cout<<ans;
	return 0;
}

这个是20分代码。 其他部分MLE,原因是getf函数进入死循环。 唯一不同的地方是22行和24行“fa[getf(y)]=dr[x]改为了fa[getf(y)]=fa[getf(dr[x])]”“fa[getf(x)]=dr[y]改为了fa[getf(x)]=fa[getf(dr[y])]”。 并不能理解中间的差别

2021/8/25 14:19
加载中...