#include <iostream>
//并查集的合并操作是指将两个元素所在集合求并集,合并为一个集合
using namespace std;
class DisjointSet {
private:
int *father;
public:
DisjointSet(int size) {
father = new int[size];
for (int i = 0; i < size; ++i) {
father[i] = i;
}
}
~DisjointSet() {
delete[] father;
}
int find_set(int node) {
if (father[node] != node) {
return find_set(father[node]);
}
return node;
}
bool merge(int node1, int node2) {
//首先需要知道两个结点node1和node2所在集合的代表元素
int ancestor1 = find_set(node1);
int ancestor2 = find_set(node2);
//其次要判断两个元素是不是在同一个集合里
if (ancestor1 != ancestor2) {
father[ancestor1] = ancestor2;
return true;
}
return false;
}
};
int main() {
DisjointSet dsu(100);
int m,x,y;
cin >> m;
for(int i=0; i<m; i++) {
cin >> x >> y;
bool ans = dsu.merge(x, y);
if (ans) {
cout << "success" << endl;
}
else {
cout << "failed" << endl;
}
}
return 0;
}
//并查集的合并操作是指将两个元素所在集合求并集,合并为一个集合
using namespace std;
class DisjointSet {
private:
int *father;
public:
DisjointSet(int size) {
father = new int[size];
for (int i = 0; i < size; ++i) {
father[i] = i;
}
}
~DisjointSet() {
delete[] father;
}
int find_set(int node) {
if (father[node] != node) {
return find_set(father[node]);
}
return node;
}
bool merge(int node1, int node2) {
//首先需要知道两个结点node1和node2所在集合的代表元素
int ancestor1 = find_set(node1);
int ancestor2 = find_set(node2);
//其次要判断两个元素是不是在同一个集合里
if (ancestor1 != ancestor2) {
father[ancestor1] = ancestor2;
return true;
}
return false;
}
};
int main() {
DisjointSet dsu(100);
int m,x,y;
cin >> m;
for(int i=0; i<m; i++) {
cin >> x >> y;
bool ans = dsu.merge(x, y);
if (ans) {
cout << "success" << endl;
}
else {
cout << "failed" << endl;
}
}
return 0;
}