vector>> getTreeLabel(const vector>& adj, int root) { vector> level = {{root}}; vector dist(sz(adj), -1); dist[root] = 0; queue q; q.push(root); while (!q.empty()) { int c = q.front(); q.pop(); for (int n : adj[c]) { if (dist[n] < 0) { dist[n] = dist[c] + 1; if (sz(level) <= dist[n]) level.push_back({}); level[dist[n]].push_back(n); q.push(n); }}} vector>> levelLabels(sz(level)); vector shortLabel(sz(adj)); for (int l = sz(level) - 1; l >= 0; l--) { vector, int>> tmpLabels; for (int v : level[l]) { vector label; for (int n : adj[v]) { if (dist[n] > dist[v]) { label.push_back(shortLabel[n]); }} sort(all(label)); tmpLabels.push_back({label, v}); } sort(all(tmpLabels)); vector& last = tmpLabels[0].first; int curId = 0; for (auto& e : tmpLabels) { levelLabels[l].push_back(e.first); if (e.first != last) curId++, last = e.first; shortLabel[e.second] = curId; }} return levelLabels; }