#ifdef _WORK_#include <vector>#include <list>#include <map>#include <set>#include <deque>#include <queue>#include <stack>#include <bitset>#include <algorithm>#include <functional>#include <numeric>#include <utility>#include <sstream>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <cctype>#include <string>#include <cstring>#include <cstdio>#include <cmath>#include <cstdlib>#include <ctime>using namespace std;typedef long long LL;#define CLR(x,y) memset((x),(y),sizeof((x)))#define FOR(x,y,z) for(int (x)=(y);(x)<(z);++(x))#define FORD(x,y,z) for(int (x)=(y);(x)>=(z);--(x))const int maxn = 1000 + 100;int fa[maxn],mrank[maxn];void ini(int n){memset(mrank,0,sizeof(mrank));for(int i = 0; i <= n;++i){fa[i] = i;}}int fnd(int x){return x ==fa[x]?x:fa[x] = fnd(fa[x]);}void uni(int x,int y){x = fnd(x);y = fnd(y);if(x == y) return ;if(mrank[x] < mrank[y]){fa[x] = y;}else {fa[y] = x;if(mrank[x] == mrank[y]) ++mrank[x];}}int main(){//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);int t;scanf("%d",&t);while(t--){int n,m;scanf("%d%d",&n,&m);ini(n);FOR(i,0,m){int u,v;scanf("%d%d",&u,&v);uni(u,v);}int ans = 0;FOR(i,1,n + 1){ if(fa[i] == i)++ans;}printf("%d\n",ans);}return 0;}#endif
[2016-03-15][HDU][1213][How Many Tables]
原文:http://www.cnblogs.com/qhy285571052/p/8ed2cdfd7f05329d8539aa040a774553.html