并查集还是挺简单的,路径压缩,按秩合并(这个很麻烦,建议了解就好,主要是路径压缩,我写的代码也只是普通的合并);
前天学的,要练练手,以防生疏;
http://acm.hdu.edu.cn/showproblem.php?pid=1232
#include <iostream> #include <cstdio> #define maxn 10010 #define INF 999999999 using namespace std; int map[maxn][maxn],set[maxn]; int find(int x) { if(set[x] == x)return x; return set[x] = find(set[x]); } int main() { int n,m; while(scanf("%d",&n),n) { scanf("%d",&m); int a,b; for(int i =1; i <= n; i++) set[i] = i; for(int i = 1; i <= m; i++) { scanf("%d%d",&a,&b); int fa = find(a),fb = find(b); if(fa != fb) set[fa] = fb; } int count = 0; for(int i = 1; i <= n; i++) { if(set[i] == i)count++; } printf("%d\n",count-1); } return 0; }
http://acm.hdu.edu.cn/showproblem.php?pid=1213
#include <iostream> #include <cstdio> #define maxn 1003 #define INF 999999999 using namespace std; int map[maxn][maxn],set[maxn]; int find(int x) { if(set[x] == x)return x; return set[x] = find(set[x]); } int main() { int T,n,m; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(int i =1; i <= n; i++) set[i] = i; int a,b; for(int i = 1; i <= m; i++) { scanf("%d%d",&a,&b); int fa = find(a),fb = find(b); if(fa != fb) set[fa] = fb; } int count = 0; for(int i = 1; i <= n; i++) { if(set[i] == i)count++; } printf("%d\n",count); } return 0; }