// UVa 11503 - Virtual Friends
// Disjoint-set forests
#include <iostream>
#include <string>
#include <map>
using namespace std;
int parent[100001], rank[100001];
void MakeSet(int x) {
parent[x] = x;
rank[x] = 1;
}
int Find(int x) {
if (parent[x] != x)
parent[x] = Find(parent[x]);
return parent[x];
}
int Union(int x, int y) {
int xRoot = Find(x);
int yRoot = Find(y);
if (xRoot == yRoot)
return rank[xRoot];
if (rank[xRoot] < rank[yRoot]) {
parent[xRoot] = yRoot;
rank[yRoot] += rank[xRoot];
return rank[yRoot];
} else {
parent[yRoot] = xRoot;
rank[xRoot] += rank[yRoot];
return rank[xRoot];
}
}
int main() {
int t;
for (cin >> t; t; t--) {
int n, m = 0;
cin >> n;
map<string, int> id;
for (int i = 0; i < n; i++) {
string f1, f2;
cin >> f1 >> f2;
if (id[f1] == 0) {
id[f1] = ++m;
MakeSet(id[f1]);
}
if (id[f2] == 0) {
id[f2] = ++m;
MakeSet(id[f2]);
}
cout << Union(id[f1], id[f2]) << endl;
}
}
return 0;
}
Monday, May 4, 2015
UVa 11503 - Virtual Friends
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment