private void setPos(int v, int p, ref List <Vector> X, ref TreeAlgo <Object> GA) { bottom = Math.Min(bottom, (int)X[v][1]); int max_w = G.adj[v][0]; int prev = -1; foreach (var to in G.adj_list(v)) { if (max_w == p && to != p) { max_w = to; } if (to != p && GA.weight(max_w) < GA.weight(to)) { max_w = to; } } foreach (var to in G.adj_list(v)) { if (to != p && to != max_w) { X[to][0] = (prev == -1) ? X[v][0] : (right[prev] + delta); X[to][1] = X[v][1] - delta; prev = to; setPos(to, v, ref X, ref GA); right[v] = Math.Max(right[v], right[to]); } } if (max_w != p) { X[max_w][0] = (prev == -1) ? (X[v][0] + delta) : (right[prev] + delta); X[max_w][1] = X[v][1]; setPos(max_w, v, ref X, ref GA); } else { right[v] = (int)X[v][0]; } if (p != -1) { right[p] = Math.Max(right[p], right[v]); } }
private void setPos(int v, int p, ref List<Vector> X, ref TreeAlgo<Object> GA) { bottom = Math.Min(bottom, (int)X[v][1]); int max_w = G.adj[v][0]; int prev = -1; foreach(var to in G.adj_list(v)) { if (max_w == p && to != p) max_w = to; if (to != p && GA.weight(max_w) < GA.weight(to)) max_w = to; } foreach(var to in G.adj_list(v)) { if (to != p && to != max_w) { X[to][0] = (prev == -1) ? X[v][0] : (right[prev] + delta); X[to][1] = X[v][1] - delta; prev = to; setPos(to, v, ref X, ref GA); right[v] = Math.Max(right[v], right[to]); } } if (max_w != p) { X[max_w][0] = (prev == -1) ? (X[v][0] + delta) : (right[prev] + delta); X[max_w][1] = X[v][1]; setPos(max_w, v, ref X, ref GA); } else right[v] = (int)X[v][0]; if (p != -1) right[p] = Math.Max(right[p], right[v]); }