并查集的模板,不理解也要背下来;
#include<bits/stdc++.h> //万能头文件 using namespace std; int par[100000],ran[10000]; //个数与深度; int n,m; void init(int n) //初始化; 当不需要返回值的时候,函数的类型标void。其实这个也是会返回一个值,好像是调用成功返回1,不成功返回0 { for(int i=1;i<=n;i++) { par[i]=i; ran[i]=0; //先认定所有都是单独的树根; } } int find(int x) //查找根节点 { if(x==par[x]) { return x; //递归 } return par[x]=find(par[x]); } void unite(int x,int y) //连根 { x=find(x); y=find(y); if(x==y) { return ; } if(ran[x]<ran[y]) { par[x]=y; } else { par[y]=x; if(ran[x]==ran[y]) { ran[x]++; } } } bool same(int x,int y) //查根 { return find(x)==find(y); } int main() { cin>>n>>m; int a,b; //输入连根的数; init(n); for(int i=1;i<=m;i++) { cin>>a>>b; unite(a,b); } int s=0; for(int i=1;i<=n;i++) { if(par[i]==i) s++; } cout<<s<<endl; return 0;