代码求调(玄关)
查看原帖
代码求调(玄关)
215817
gyc071116楼主2024/10/20 10:03

死循环,不知道哪写错了

#include<bits/stdc++.h>
using namespace std;
struct ee{
	int to;
	int next;
}edge[5005];
int h[1005],fa[1005],etot,size[1005],is_fa[1005],sum;
void add_edge(int u,int v){
	edge[etot]=(ee){v,h[u]};
	h[u]=etot++;
}
int find(int a){
	if(fa[a]==a) return a;
	else return fa[a]=find(fa[a]);
}
void unin(int x,int y){
	x=find(x),y=find(y);
	if(x==y) return;
	if(size[x]>size[y]) swap(x,y);
	if(size[x]==size[y]) size[y]++;
	fa[x]=y;
	return;
}
int main(){
	int n,m;
	scanf("%d",&n);
	scanf("%d",&m);
	for(int i=1;i<=n;i++){
		size[i]=1;
		fa[i]=i;
		h[i]=-1;
	}
	for(int i=1;i<=m;i++){
		char c;
		int p,q;
		scanf("%c %d %d\n",&c,&p,&q);
		if(c=='F') unin(p,q);
		else add_edge(p,q),add_edge(q,p);
	}
	for(int i=1;i<=n;i++){
		int l=h[i];
		for(int j=edge[l].next;j!=-1;j=edge[j].next)
			unin(edge[l].to,edge[j].to);
	}
	for(int i=1;i<=n;i++) is_fa[find(i)]=1;
	for(int i=1;i<=n;i++) if(is_fa[i]) ++sum;
	printf("%d",sum);
	return 0;
}
2024/10/20 10:03
加载中...