Today is Ignatius' birthday. He invites a lot of friends. Now it's dinner time. Ignatius wants to know how many tables he needs at least. You have to notice that not all the friends know each other, and all the friends do not want to stay with strangers.
One important rule for this problem is that if I tell you A knows B, and B knows C, that means A, B, C know each other, so they can stay in one table.
For example: If I tell you A knows B, B knows C, and D knows E, so A, B, C can stay in one table, and D, E have to stay in the other one. So Ignatius needs 2 tables at least.
One important rule for this problem is that if I tell you A knows B, and B knows C, that means A, B, C know each other, so they can stay in one table.
For example: If I tell you A knows B, B knows C, and D knows E, so A, B, C can stay in one table, and D, E have to stay in the other one. So Ignatius needs 2 tables at least.
2 5 3 1 2 2 3 4 5 5 1 2 5
2 4
题目大意: 有n个人,m个分组,每个分组说明这几个人是朋友,如果是朋友就需要一起坐在一个桌子上吃饭,朋友的朋友也是朋友。问最后需要多少个桌子。
题目分析:裸的并查集。详见我的并查集详解的那个博文。
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 1005; int a[maxn],fa[maxn]; int find(int x){ int p,t; p=x; while(p != fa[p]) p = fa[p]; while(x != p){ t = fa[x]; fa[x] = p; x = fa[x]; } return x; } void join(int x,int y){ int fx = find(x); int fy = find(y); if(fx != fy){ fa[fx] = fy; } } int main(){ int t; cin>>t; while(t--){ int n,m; cin>>n>>m; for(int i=1;i<=n;i++) fa[i] = i; for(int i=1;i<=m;i++){ int c,d; cin>>c>>d; join(c,d); } int ans = 0; for(int i=1;i<=n;i++) if(fa[i] == i) ans++; cout<<ans<<endl; } return 0; }