2024蓝桥杯C++A组:团建(层序遍历)

题目描述

解题思路

先将树的孩子用vector容器进行存储,因题目说明每棵树不会有节点的值重复,故进行层序遍历,判断树的每层是否有相同结点值,以此判断最长公共前缀
 

附代码+注释

#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
#define ll long long
using namespace std;
const int T = 200000;
vector<vector<int>> tree1(T);
vector<vector<int>> tree2(T);
vector<int> nums1(T);
vector<int> nums2(T);
int N, M;
int get() {
	int sum = 0;	
	int t1 = 1, t2 = 1;
	if (nums1[1] == nums2[1]) sum++;
	else return 0;
	while (1) {
		int i, j;
		int flag = 1;
		if (tree1[t1].size() == 0 || tree2[t2].size() == 0) break;
		for (i = 0; i < tree1[t1].size(); i++) {
			for (j = 0; j < tree2[t2].size(); j++) {
				if (nums1[tree1[t1][i]] == nums2[tree2[t2][j]])   //寻找公共前缀
				{
					flag = 0;
					t1 = tree1[t1][i];
					t2 = tree2[t2][j];                            //选取下一层的父节点
					sum++;
					break;
				}
			}
		}
		if (flag) break;
	}
	return sum;
}
int main() {
	cin >> N >> M;
	int n = N, m = M;
	int temp;
	while (n--) {
		cin >> temp;
		nums1[N - n] = temp;
	}
	while (m--) {
		cin >> temp;
		nums2[M - m] = temp;
	}
	n = N - 1; m = M - 1;
	int t1, t2;
	while (n--) {
		cin >> t1 >> t2;
		tree1[min(t1, t2)].push_back(max(t1, t2));
	}
	while (m--) {
		cin >> t1 >> t2;
		tree2[min(t1, t2)].push_back(max(t1, t2));       //存储每个节点的孩子
	}
	cout << get();
	return 0;
}

  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值