新年第一 po!
题解 #
这个题我们用并查集来合并集合并用std::list
或 std::vector
来维护每个集合里面的元素。(理论上来说 list 应该快很多,但提交后的运行时间差不多)
具体步骤就是:
- 找到两个猫的祖先的 id
- 合并两个集合,并且拼接两个链表(或者数组)
Code #
#include <bits/stdc++.h>
#define forn(i, n) for (int i = 0; i < int(n); ++i)
#define for1(i, n) for (int i = 1; i <= int(n); ++i)
#define fore(i, l, r) for (int i = int(l); i <= int(r); ++i)
#define ford(i, n) for (int i = int(n)-1; i >= 0; --i)
#define pb push_back
#define eb emplace_back
#define ms(a, x) memset(a, x, sizeof(a))
#define F first
#define S second
#define endl '\n'
#define _ <<' '<<
#define de(x) cout<<#x<<" = "<<(x)<<endl
#define de2(x,y) cout<<#x<<" = "<<(x) _ #y<<" = "<<y<<endl;
using namespace std;
const int INF = 0x3f3f3f3f;
typedef long long ll;
typedef pair<int, int> pii;
mt19937 gen(chrono::high_resolution_clock::now().time_since_epoch().count());
const int N=15e4+5;
int pre[N];
int find(int x){
return pre[x]==x?x:pre[x]=find(pre[x]);
}
void join(int x,int y){
x=find(x),y=find(y);
pre[x]=y;
}
list<int> v[N];
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin>>n;
for1(i,n) pre[i]=i,v[i].eb(i);
forn(i,n-1){
int x,y;
cin>>x>>y;
x=find(x),y=find(y);
v[x].splice(v[x].end(),v[y]);
pre[y]=x;
}
for(auto it:v[find(1)]) cout<<it<<' ';
return 0;
}