海上有N(1<= N <=2000)个岛,编号从1到N,同一部落的岛屿之间有直接或间接的路相连,不同部落之间无路可通。现在给出M(1<= M <= N*(N-1)/2)条路。问这片海域上共有多少部落。
Input
多组输入。每组第一行输入N,M。接下来M行每行,每行两个整数u,v代表岛u与v之间有一条路。
Output
每组数据输出一个整数,代表部落数。
Sample Input
3 1 1 2 3 2 1 2 1 3
Sample Output
2 1
刚开始时parent数组是char型的,后一想不对啊,改为int型的,这样就不能用memset了,不过可以用fill
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #define Maxn 2010 using namespace std; int parent[Maxn]; int Find(int x) { int r,temp; for(r=x; parent[r]>=0; r=parent[r]); while(r!=x) { temp=x; x=parent[x]; parent[temp]=r; } return r; } void merge(int A,int B) { int a=Find(A),b=Find(B); if(a!=b) { int temp=parent[a]+parent[b]; if(parent[a]>parent[b]) { parent[a]=b; parent[b]=temp; } else { parent[b]=a; parent[a]=temp; } } } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { int i,ans=0,a,b; fill(parent,parent+Maxn,-1); for(i=0; i<m; i++){ scanf("%d%d",&a,&b); merge(a,b); } for(i=1;i<=n;i++) if(parent[i]<0) ans++; printf("%d ",ans); } return 0; }