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;
}