bzoj 3197
2024-08-26 07:03:06
题解:
先找到中信
然后dp
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=;
int n,mx,go,bx,by,rot,x,y,g[N][],a[N],b[N],s[N],c[N],f[N];
void dfs(int x,int fa,int dep)
{
s[++s[]]=x;
if (dep>mx)
{
mx=dep;
go=x;
memcpy(c,s,sizeof s);
}
for (int i=;i<=g[x][];i++)
if (g[x][i]!=fa) dfs(g[x][i],x,dep+);
s[]--;
}
void build(int x,int fa)
{
int t[];
t[]=;
for (int i=;i<=g[x][];i++)
if (g[x][i]!=fa&&!(x==bx&&g[x][i]==by||x==by&&g[x][i]==bx))
t[++t[]]=g[x][i];
memcpy(g[x],t,sizeof t);
for (int i=;i<=g[x][];i++) build(g[x][i],x);
}
int dp(int x,int y)
{
int w[][];
if (g[x][]!=g[y][]) return (~0U>>);
for (int i=;i<=g[x][];i++)
for (int j=;j<=g[y][];j++)w[i][j]=dp(g[x][i],g[y][j]);
for (int i=;i<<<g[x][];i++)f[i]=(~0U>>);
f[(<<g[x][])-]=;
for (int i=(<<g[x][])-;i;i--)
if (f[i]<(~0U>>))
{
int cnt=g[x][];
for (int j=;j<g[x][];j++)
if (i&(<<j)) cnt--;
for (int j=;j<g[x][];j++)
if (i&(<<j))f[i^(<<j)]=min(f[i^(<<j)],f[i]+w[cnt+][j+]);
}
return f[]+(a[x]!=b[y]);
}
int main()
{
scanf("%d",&n);
for (int i=;i<n;i++)
{
scanf("%d%d",&x,&y);
g[x][++g[x][]]=y;
g[y][++g[y][]]=x;
}
for (int i=;i<=n;i++) scanf("%d",&a[i]);
for (int i=;i<=n;i++) scanf("%d",&b[i]);
dfs(,,);
dfs(go,mx=,);
if (c[]&) rot=c[+c[]>>];
else
{
rot=n+;
bx=g[rot][++g[rot][]]=c[c[]>>];
by=g[rot][++g[rot][]]=c[(c[]>>)+];
}
build(rot,);
printf("%d",dp(rot,rot));
return ;
}
最新文章
- AOP面向切面编程的四种实现
- 体验VS2015 Update 2 的 Android 和 Python
- 【Codeforces715C&;716E】Digit Tree 数学 + 点分治
- .NET程序优化
- 正整数的n次方求和
- hdu 5586 Sum【dp最大子段和】
- 介绍map.entry接口
- C++中为什么要用虚函数、指针或引用才能实现多态?
- BZOJ 1015 [JSOI2008]星球大战starwar
- setTimeout的时间设为0的问题
- Oracle与mysql的字段类型整理
- 如何兼容所有Android版本选择照片或拍照然后裁剪图片--基于FileProvider和动态权限的实现
- nyoj 仿射密码
- 经典合集 - WP8.1数据源
- Gym 101194L / UVALive 7908 - World Cup - [三进制状压暴力枚举][2016 EC-Final Problem L]
- Eclipse Python 开发环境搭建 pydev 插件
- springboot系列七:springboot 集成 MyBatis、事物配置及使用、druid 数据源、druid 监控使用
- pythoy-生成器
- ReactNative仿微信朋友圈App
- 设计多选一按钮ChooseOnlyButton