题解:

先找到中信

然后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 ;
}

bzoj 3197的更多相关文章

  1. bzoj 3197 DP

    这道题我们可以看成给定两个黑白树,可以修改其中一棵树的颜色,问最少修改多少颜色可以使两棵树同构. 首先我们知道在树的同构中树上最长链中点(如果是偶数的话就是中间两个点)是不变的,我们把这个点叫做树的重 ...

  2. bzoj 3197 [Sdoi2013]assassin(Hash+DP+KM)

    Description Input Output Sample Input 4 1 2 2 3 3 4 0 0 1 1 1 0 0 0 Sample Output 1 HINT [思路] Hash,D ...

  3. BZOJ 3197: [Sdoi2013]assassin 树形DP + 最小费用流 + 树的同构

    Description Input Output 其实就是给出两颗树,求一种两种树同构的方式,使得不同颜色个数最少$.$树的重新构建,其实就是指定不同的点为根节点$.$ 好在树的重心有一个重要的性质: ...

  4. BZOJ 3197 [Sdoi2013]assassin

    题解: 树上Hash 首先重心在边上就把边分裂 以重心为根建树,这样两个根一定对应 然后f[i][j]表示i匹配另一棵的j节点的最小代价 把他们的儿子摘出来做最小权匹配即可 #include<i ...

  5. 洛谷3197&bzoj1008 越狱

    洛谷3197&bzoj1008 越狱 Luogu bzoj 题解 所有状态减合法状态.SBT 答案为\(m^n-m*(m-1)^{n-1}\)太SB不解释 注意取膜的问题.相减可能减出负数,而 ...

  6. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  7. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  8. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  9. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

随机推荐

  1. Gym 100548F Color 2014-2015 ACM-ICPC, Asia Xian Regional Contest (容斥原理+大数取模)

    题意:有N朵花,在M种颜色中选择恰好k种不同的颜色,将这N朵花染色,要求相邻的两朵花颜色不相同. 分析:若限制改为选择不超过k种颜色将N朵花朵染色,则方案数\(f(N,k) = k*(k-1)^{N- ...

  2. curl 命令返回json结构human readable

    在curl命令后面添加 | python -m json.tool 不想显示curl的统计信息,添加 -s参数 例: curl https://news-at.zhihu.com/api/4/news ...

  3. 【U3D】脚本引用的类,如何显示在编辑器界面

    有时候,我们的类里面会组合其他功能模块 如何让这些功能类的值在编辑器界面出现呢? 1:引用类的访问类型必须是Public 2: 类必须声明为可序列化的,即在类头加入以下声明 [System.Seria ...

  4. 自定义圆形头像CircleImageView的使用和源码分析

    http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0806/3268.html tools:context="com.ex ...

  5. javascript 面向对象 new 关键字 原型链 构造函数

    JavaScript面向对象JavaScript 语言使用构造函数(constructor)作为对象的模板.所谓"构造函数",就是专门用来生成实例对象的函数.它就是对象的模板,描述 ...

  6. Net_Prop 之 CTerrorPlayer 属性

    Sub-Class Table (1 Deep): DT_TerrorPlayer Sub-Class Table (2 Deep): DT_CSPlayer Sub-Class Table (3 D ...

  7. git基础常用维护命令

    开发模式介绍 master为生产环境分支 trunk为测试环境分支 开发分支由程序员自己取名 比如来一个新项目之后,下面步骤都是在本地操作 1.从本地获取远程master最新代码,保证本地master ...

  8. 爬虫框架Scrapy之Spider

    Spider Spider类定义了如何爬取某个(或某些)网站.包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item). 换句话说,Spider就是您定义爬取的动作及 ...

  9. 上采样和PixelShuffle(转)

    有些地方还没看懂, mark一下 文章来源: https://blog.csdn.net/g11d111/article/details/82855946 去年曾经使用过FCN(全卷积神经网络)及其派 ...

  10. docker-machine windows

    windows 官方使用 https://docs.docker.com/machine/drivers/hyper-v/ 坑点是  docker-machine create -d hyperv m ...