Copil Copac Draws Trees
题意:
给一个有n个节点的数,现在建树,要求当前边的两个点必须有一个点已经绘制完成,从1号点开始。如果两个点都未绘制过,则开始一次新的操作,问建成这棵树需要的操作数。
思路:
其实就是模拟键边的顺序,先把每条边的序号记下来,然后对1号点的儿子进行dfs,如果对于每个点,如果当前点接入图的边的序号在其儿子节点之后,则操作数要加一。
代码:
int n;
int dfs(int u, int fa, vector<vector<int>>& g, map<pair<int, int>, int>& mp) {
int ans = 0;
for (auto p : g[u]) {
if (p == fa) continue;
ans = max(ans, (mp[{fa, u}] > mp[{u, p}]) + dfs(p, u, g, mp));
}
return ans;
}
void solve() {
cin >> n;
vector<vector<int>> g(n + 1, vector<int>());
map<pair<int, int>, int> mp;
for (int i = 1; i <= n - 1; i++) {
int u, v;
cin >> u >> v;
mp[{u, v}] = i;
mp[{v, u}] = i;
g[u].push_back(v);
g[v].push_back(u);
}
int ans = 0;
for (auto p : g[1]) ans = max(ans, dfs(p, 1, g, mp));
cout << ans + 1 << endl;
}