这是一个并查集的题,被洛谷评为提高—。
拿到这个题便看出了这是一个裸的并查集,于是就写了一个模板,结果发现连输入都输不进去,一看竟然是多组数据,,然后看到N==0结束,于是便加了一层while。之后提交发现RE了,于是想到shh大佬曾经说RE就是递归写错了,于是仔细检查,发现真的写错了,,然后AC。
1.并查集get_f那一段的函数要仔细写
2.多组数据的话,单循环直接break,多循环记录一个flag,然后break
3.多组数据就算出一组输出一组(我再去问问lz)
代码
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #define N 1000001 using namespace std; int n,m; int ans[N]; int f[N]; void init(){ for(int i=1;i<=n;i++){ f[i]=i; } return; } int get_f(int v){ if(f[v]==v) return f[v]; else return f[v]=get_f(f[v]); } void merge(int u,int v){ int t1=get_f(u); int t2=get_f(v); if(t1!=t2){ f[min(t1,t2)]=t1+t2-min(t1,t2); } } int cnt=0; int main(){ while(true){ cin>>n>>m; if(n==0){ return 0; } else{ for(int i=1;i<=n;i++){ f[i]=i; } cnt++; for(int i=1;i<=m;i++){ int x,y; cin>>x>>y; merge(x,y); } for(int i=1;i<=n;i++){ if(get_f(i)==i){ ans[cnt]++;//有几个单独的路 } } cout<<ans[cnt]-1<<endl; } } return 0; }