返回题解分享
讨论 / 题解分享/ 帖子详情

团建(编程题) - 题解

// https://www.lanqiao.cn/problems/19704/learning/?page=1&first_category_id=1&name=%E5%9B%A2%E5%BB%BA
#include <bits/stdc++.h>

#define N 200020
using namespace std;
typedef long long ll;
ll n, m, ans = 0;
vector<ll> t1v(N), t2v(N); // value[]
map<ll, vector<ll>> tree1, tree2; // id, list[]

void dfs(ll x, ll y, ll cnt) {
	if (t1v[x] != t2v[y]) return;
	ans = max(ans, cnt + 1);
	for (int i = 0; i < tree1[x].size(); i++)
		for (int j = 0; j < tree2[y].size(); j++)
			dfs(tree1[x][i], tree2[y][j], cnt + 1);
}

int main() {
	cin >> n >> m;
	for (int i = 1; i <= n; i++) cin >> t1v[i];
	for (int i = 1; i <= m; i++) cin >> t2v[i];
	for (int i = 1; i < n; i++) {
		ll u, v;
		cin >> u >> v;
		tree1[u].push_back(v);
	}
	for (int i = 1; i < m; i++) {
		ll p, q;
		cin >> p >> q;
		tree2[p].push_back(q);
	}
	dfs(1, 1, 0);
	cout << ans << endl;
	return 0;
}
1 回复 0 转发 1 喜欢 2 阅读
回复 (1)
默认 最新
露米 2026/2/6
谢谢你分享的题解,代码结构写得很清晰,DFS 的思路也很直观,让人一眼就能看懂匹配的逻辑。

在处理这类树结构匹配的问题时,这种递归对比的方法确实很经典。不过我稍微留意了一下,在遍历子节点时用了两层嵌套循环,如果遇到某些测试点的子节点数量比较多,可能会给运行时间带来一点压力。

或许可以尝试先对子节点的值进行排序,或者引入哈希来优化匹配的过程?这样在处理大规模数据时可能会更从容一些。

期待看到你后续的优化思路,加油 🙂
另外,我注意到代码中使用了 map 来存储邻接表,虽然写起来很直观,但在处理大规模数据时,数组模拟邻接表通常会更节省运行时间。

你在练习的时候,会更倾向于先写出这种易读的代码,还是在第一遍就尝试各种性能优化呢?欢迎随时回来交流你的心得 🙂
0