How Many Tables
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 33675 Accepted Submission(s): 16840
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
#include <iostream>
#include <cmath>
#include <ctime>
using namespace std;
const int maxn = 1005;
int n,m,i,j,k,tot;
int root[maxn];
void init(){
for (i=1; i<=n; i++) root[i] = i;
tot = 0;
}
int Find(int x){
int r = x;
while (r!=root[r]) r = root[r];
int i = x, k;
while (root[i] != r) {
k = root[i];
root[i] = r;
i = k;
}
return r;
}
void Merge(int x, int y){
int fx = Find(x), fy = Find(y);
if (fx != fy) root[fx] = fy;
}
int main(){
std::ios::sync_with_stdio(false);
int t;
cin >> t;
while (t--) {
cin >> n >> m;
init();
for (k=1; k<=m; k++) {
cin >> i >> j;
Merge(i,j);
}
for (i=1; i<=n; i++) if (root[i]==i) tot++;
cout << tot << endl;
}
return 0;
}
971



被折叠的 条评论
为什么被折叠?



