【NOIP2015模拟10.28B组】序章-弗兰德的秘密题解

博客探讨了NOIP2015模拟赛中关于树同构的问题,解释了如何计算两棵有根树在删除节点后能形成的最大同构树的大小。通过描述输入输出格式、数据限制和示例,阐述了问题的背景和解决方案,提出了O(n^2)的时间复杂度算法,通过递归枚举节点匹配来求解最大相似度。

Description

弗兰德的密室里,机关上方画着两棵树的字样,机关下方是一个有数字的刻度……
弗兰德最高的两棵树,只要知道两棵树的共同的相似度就行了……
给定两棵有根树,可以任意删除两棵树上的节点(删除一棵节点必须保证该节点的子树内的所有节点也必须要被删除,换一种说法,删除后的树必须联通并形成一棵树,且根节点不能被删除),使得删除后的两棵树同构,这两棵树有一个共同大小,即树的size,最大化同构的树的size即为机关的答案……

注:两棵同构的树要满足以下条件:
1、两棵树节点个数相等。
2、两棵树的以根节点的儿子为根子树对应同构。如下图,为两棵同构的有根树。
如下图,为两棵同构的有根树。
在这里插入图片描述

Input

一行两个整数n,m分别表示两棵有根树的大小。
以下n-1行描述第一棵树,每行两个数x,y表示x号节点是y号节点父亲。
以下m-1行描述第二棵树,每行两个数x,y表示x号节点是y号节点父亲。
数据保证两棵树的1号节点均为根。

Output

一行一个数,表示两棵树的相似度(删除后最大化的同构树的大小)。

Sample Input

3 3
1 2
1 3
1 2
2 3

Sample Output

2

Data constraint

对于30%的数据,1 ≤ n ≤10
对于60%的数据,1 ≤ n ≤ 100
对于100%的数据,1 ≤ n ≤ 1000数据保证两棵树上每个节点的度均不超过5。

Hint

第一棵树可以保留1号节点和2号节点删除3号节点,也可以保留1号节点与3号节点删除2号节点,
第二棵树保留1号节点和2号节点删除3号节点。
剩下的树同构,树的节点个数均为2。

Solution

首先,我们先观察一下数据,可以发现每一个节点除了根节点以外都最多只有4个儿子,而且nnn只有1000,所以我们可以考虑一下O(n2)O(n^{2})O(n2)的算法。
设一个fi,jf_{i,j}fi,j表示把第一棵树以iii号节点为根的子树和第二棵树以jjj号节点为根的子树构成同构所有的最大数量。很容易可以得到fi,jf_{i,j}fi,j可以从iiijjj的儿子进行匹配的所有情况得到的最大答案去转移。发现节点的儿子不超过5个,所以可以用递归暴力枚举出所有情况进行转移。最后输出f1,1f_{1,1}f1,1即可。

Code

#include<cstdio>
#include<vector>
using namespace std;
int n,m;
const int N=1005;
vector <int> son[N],son2[N];
int size[N],size2[N],f[N][N],a[125][2];
bool bz[N],bz2[N];
void dfs(int now) {
	size[now]=1;
	for(int i=0;i<son[now].size();i++) {
		dfs(son[now][i]);
		size[now]+=size[son[now][i]];
	}
}
void dfs2(int now) {
	size2[now]=1;
	for(int i=0;i<son2[now].size();i++) {
		dfs2(son2[now][i]);
		size2[now]+=size2[son2[now][i]];
	}
}
void dg(int now,int nx,int ny,int c,int s) {
	if(now>c) {
		if(s>f[nx][ny])f[nx][ny]=s;
		return;
	}
	if(!bz[a[now][0]]&&!bz2[a[now][1]]) {
		bz[a[now][0]]=1;
		bz2[a[now][1]]=1;
		dg(now+1,nx,ny,c,s+f[a[now][0]][a[now][1]]);
		bz[a[now][0]]=0;
		bz2[a[now][1]]=0;
	}
	dg(now+1,nx,ny,c,s);
}
void dp(int x,int y) {
	if(size[x]==1&&size2[y]==1) {
		f[x][y]=1;
		return;
	}
	int cnt=0;
	for(int i=0;i<son[x].size();i++)
		for(int j=0;j<son2[y].size();j++)
			dp(son[x][i],son2[y][j]);
	for(int i=0;i<son[x].size();i++)
		for(int j=0;j<son2[y].size();j++) {
			a[++cnt][0]=son[x][i];
			a[cnt][1]=son2[y][j];
		}
	dg(1,x,y,cnt,1);
}
int main() {
	scanf("%d%d",&n,&m);
	for(int i=1;i<n;i++) {
		int u,v;
		scanf("%d%d",&u,&v);
		son[u].push_back(v);
	}
	for(int i=1;i<m;i++) {
		int u,v;
		scanf("%d%d",&u,&v);
		son2[u].push_back(v);
	}
	dfs(1);
	dfs2(1);
	dp(1,1);
	printf("%d",f[1][1]);
	return 0;
}
当前,全球经济格局深刻调整,数字化浪潮席卷各行各业,智能物流作为现代物流发展的必然趋势和关键支撑,正迎来前所未有的发展机遇。以人工智能、物联网、大数据、云计算、区块链等前沿信息技术的快速迭代与深度融合为驱动,智能物流不再是传统物流的简单技术叠加,而是正在经历一场从自动化向智能化、从被动响应向主动预测、从信息孤岛向全面互联的深刻变革。展望2025年,智能物流系统将不再局限于提升效率、降低成本的基本目标,而是要构建一个感知更全面、决策更精准、执行更高效、协同更顺畅的智慧运行体系。这要求我们必须超越传统思维定式,以系统化、前瞻性的视角,全面规划和实施智能物流系统的建设。本实施方案正是基于对行业发展趋势的深刻洞察和对未来需求的精准把握而制定。我们的核心目标在于:通过构建一个集成了先进感知技术、大数据分析引擎、智能决策算法和高效协同平台的综合智能物流系统,实现物流全链路的可视化、透明化和智能化管理。这不仅是技术层面的革新,更是管理模式和服务能力的全面提升。本方案旨在明确系统建设的战略方向、关键任务、技术路径和实施步骤,确保通过系统化部署,有效应对日益复杂的供应链环境,提升整体物流韧性,优化资源配置效率,降低运营成本,并最终为客户创造更卓越的价值体验。我们致力于通过本方案的实施,引领智能物流迈向更高水平,为构建现代化经济体系、推动高质量发展提供强有力的物流保障。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值