CSES - Datatähti Open 2021 - Results
Submission details
Task:Distances
Sender:eggag32
Submission time:2021-01-30 20:15:02 +0200
Language:C++ (C++17)
Status:READY
Result:100
Feedback
groupverdictscore
#1ACCEPTED29
#2ACCEPTED71
Test results
testverdicttimegroup
#1ACCEPTED0.01 s1, 2details
#2ACCEPTED0.01 s2details

Code

#pragma GCC optimize ("O3")
#pragma GCC target ("sse4")
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef vector<int> vi;
typedef pair<int, int> pi;
#define debug(x) cerr << #x << ": " << x << endl
#define debug2(x, y) debug(x), debug(y)
#define repn(i, a, b) for(int i = (int)(a); i < (int)(b); i++)
#define rep(i, a) for(int i = 0; i < (int)(a); i++)
#define all(v) v.begin(), v.end() 
#define mp make_pair
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define fi first
#define se second
#define sq(x) ((x) * (x))
const int mxN = 105;

template<class T> T gcd(T a, T b){ return ((b == 0) ? a : gcd(b, a % b)); }

vi g[mxN];
vi fr[mxN], ba[mxN];

void dfs(int cur, int prev = -1, int de = 0){
	int cnt = 0, fst = -1;
	for(int x : g[cur]) if(x != prev){
		cnt++;
		if(fst == -1) fst = x;
	}
	if(cnt > 1){
		if(de % 2 == 0){
			for(int x : g[cur]) if(x != prev){
				dfs(x, cur, de + 1);
				if(x == fst){
					rep(j, fr[x].size()) fr[cur].pb(fr[x][j]);
					rep(j, ba[x].size()) ba[cur].pb(ba[x][j]);
				}
				else{
					vi curL;
					rep(j, ba[x].size()) curL.pb(ba[x][j]);
					reverse(all(curL));
					rep(j, curL.size()) fr[cur].pb(curL[j]);
					rep(j, fr[x].size()) fr[cur].pb(fr[x][j]);
				}
			}
			fr[cur].pb(cur);
		}
		else{
			for(int x : g[cur]) if(x != prev){
				dfs(x, cur, de + 1);
				if(x == fst){
					rep(j, fr[x].size()) fr[cur].pb(fr[x][j]);
					rep(j, ba[x].size()) ba[cur].pb(ba[x][j]);
				}
				else{
					vi curL;
					rep(j, ba[x].size()) curL.pb(ba[x][j]);
					reverse(all(curL));
					rep(j, curL.size()) fr[cur].pb(curL[j]);
					rep(j, fr[x].size()) fr[cur].pb(fr[x][j]);
				}
			}
			ba[cur].pb(cur);
		}
	}
	else{
		for(int x : g[cur]) if(x != prev){
			dfs(x, cur, de + 1);
			fr[cur] = fr[x];
			ba[cur] = ba[x];
		}
		if(de % 2 == 0) fr[cur].pb(cur);
		else ba[cur].pb(cur);
	}
}

void solve(){
	int n;
	cin >> n;
	rep(i, n) g[i].clear(), fr[i].clear(), ba[i].clear();
	rep(i, n - 1){
		int a, b;
		cin >> a >> b;
		a--, b--;
		g[a].pb(b);
		g[b].pb(a);
	}
	dfs(0);
	reverse(all(fr[0]));
	rep(i, fr[0].size()) cout << fr[0][i] + 1 << " ";
	rep(i, ba[0].size()) cout << ba[0][i] + 1 << " ";
	cout << '\n';
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	//freopen("input.in", "r", stdin);
	//freopen("output.out", "w", stdout);
	int t;
	cin >> t;
	while(t--) solve();
	return 0;
}
/*
Things to look out for:
	- Integer overflows
	- Make sure that max is large enough (2e9, 4e18)
	- Special cases
Be careful!
*/

Test details

Test 1

Group: 1, 2

Verdict: ACCEPTED

input
100
8
5 2
2 3
3 7
...

correct output
1 8 2 5 6 7 3 4 
1 7 2 8 3 6 4 5 
1 4 6 2 7 5 8 3 
1 8 3 2 4 7 6 5 
1 6 4 7 5 2 3 8 
...

user output
1 8 7 2 6 5 3 4 
1 4 6 5 7 2 8 3 
1 6 5 2 7 8 3 4 
1 5 7 4 2 8 3 6 
1 4 7 5 2 3 8 6 
...
Truncated

Test 2

Group: 2

Verdict: ACCEPTED

input
100
100
37 59
81 37
44 81
...

correct output
1 99 82 81 59 5 71 55 17 24 13...

user output
1 30 45 99 82 12 93 47 11 19 6...
Truncated