时间:2016-03-15 16:19:15 星期二
题目编号:[2016-03-15][HDU][1213][How Many Tables]
题目大意:请朋友吃饭,每个朋友都不喜欢和不认识的人在一桌,给出认识的关系,问至少要多少桌
输入:
- t组数
- 每组数据
- n m
- m行 u v 表示u 和 v 认识
输出:
分析:并查集,求集合的数目
#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