From 5ab8a5088b729a9953b8dff1b2a985dc8fb2098b Mon Sep 17 00:00:00 2001 From: mzuenni Date: Mon, 27 Jun 2022 17:19:28 +0200 Subject: updated tcr --- graph/treeIsomorphism.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 graph/treeIsomorphism.cpp (limited to 'graph/treeIsomorphism.cpp') diff --git a/graph/treeIsomorphism.cpp b/graph/treeIsomorphism.cpp new file mode 100644 index 0000000..f3e147b --- /dev/null +++ b/graph/treeIsomorphism.cpp @@ -0,0 +1,41 @@ +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; +} -- cgit v1.2.3