#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])]”。 并不能理解中间的差别