Input The input starts with an integer T(1<=T<=25) which indicate the number of test cases. Then T test cases follow. Each test case starts with two integers N and M(1<=N,M<=1000). N indicates the number of friends, the friends are marked from 1 to N. Then M lines follow. Each line consists of two integers A and B(A!=B), that means friend A and friend B know each other. There will be a blank line between two cases.
Output For each test case, just output how many tables Ignatius needs at least. Do NOT print any blanks.
Sample Input 2 5 3 1 2 2 3 4 5 5 1 2 5
Sample Output 2 4 这个是并查集基础题。 emmmmm,我交了10多次才发现我在一个小地方上犯了傻逼的错。。。。 C++代码: #include<iostream> #include<stdio.h> #include<cstring> using namespace std; const int maxn = 1010; int father[maxn],vis[maxn]; int Find(int x){ while(x != father[x]){ father[x] = father[father[x]]; x = father[x]; } return x; } void Union(int a,int b){ int ax = Find(a); int bx = Find(b); if(ax != bx){ father[ax] = bx; } // if(a != b) // father[a] = b; //这个错的太傻逼了吧 } int main(){ int T; scanf("%d",&T); int a,b; while(T--){ int n,m; scanf("%d%d",&n,&m); memset(vis,0,sizeof(vis)); for(int i = 1; i <= n; i++) father[i] = i; for(int i = 0; i < m; i++){ scanf("%d%d",&a,&b); Union(a,b); } int sum = 0; for(int i = 1; i <= n; i++){ if(father[i] == i) sum++; } cout<<sum<<endl; } return 0; }
转载于:https://www.cnblogs.com/Weixu-Liu/p/10908145.html