求助!10pts,只过了第一个点!(可明明第二个点下载了之后跑的也一样)
查看原帖
求助!10pts,只过了第一个点!(可明明第二个点下载了之后跑的也一样)
579266
Dr_MING楼主2022/10/9 19:20

rt,如果是F就合并到一起,如果是E就建图,大于两条边了就连的两个点合并(同一个敌人,我们就是朋友)

#include<bits/stdc++.h>
using namespace std;
const int maxn=1140,maxm=5140;
int n,m,ans,tot;
int fa[maxn],ru[maxn],head[maxn];

struct edge{
	int x,y,nexto;
}e[maxm];

int red() {
	int as = 0; int fl = 1; char ch = getchar();
	while(!isdigit(ch)) {if(ch == '-') fl = -1; ch = getchar();}
	while(isdigit(ch)) {as = as * 10 + ch - '0'; ch = getchar();}
	return as * fl;
}

int findfa(int i){
	if(fa[i]==i)	return i;
	return	findfa(fa[i]);
}

void add(int a,int b){
	e[++tot].x=a;
	e[tot].y=b;
    e[tot].nexto=head[a];
    head[a]=tot;
}

void chuli(int a){
	int s=e[head[a]].y;
	int f=e[e[head[a]].nexto].y;
	int f1=findfa(f);
	fa[s]=f1;
	ru[s]--;
	ru[f]--;
	head[a]=e[head[a]].nexto;
}

int main(){
	n=red();
	m=red();
	for(int i=1;i<=n;i++)
		fa[i]=i;
	for(int i=1;i<=m;i++){
		int a,b;
		char v;
		v=getchar();
		a=red();
		b=red();
		if(v=='F'){
			int f1=findfa(a);
			int f2=findfa(b);
			fa[b]=f1;
		}
		if(v=='E'){
			add(a,b);
			add(b,a);
			ru[a]++;
			ru[b]++;
			if(ru[a]>=2){
				chuli(a);
			}
			if(ru[b]>=2){
				chuli(b);
			}
		}
	}
	for(int i=1;i<=n;i++)
		if(fa[i]==i)
			ans++;
	printf("%d",ans);
	return 0;
}
2022/10/9 19:20
加载中...