丢下题解跑:http://blog.csdn.net/PoPoQQQ/article/details/43206463

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define cl(x) memset(x,0,sizeof(x))
using namespace std;
typedef unsigned long long ull;inline char nc()
{static char buf[100000],*p1=buf,*p2=buf;if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }return *p1++;
}inline void read(int &x)
{char c=nc(),b=1;for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}namespace KMA{const int N=15;int n,w[N][N];int boy[N],lx[N],ly[N],sla[N];int S[N],T[N];inline bool match(int u){S[u]=1;for (int v=1;v<=n;v++){if (T[v]) continue;if (lx[u]+ly[v]==w[u][v]){T[v]=1;if (!boy[v] || match(boy[v]))return boy[v]=u,1;}elsesla[v]=min(sla[v],lx[u]+ly[v]-w[u][v]);}return 0;}inline int KM(){cl(boy); cl(ly);for (int i=1;i<=n;i++){lx[i]=-1<<30;for (int j=1;j<=n;j++) lx[i]=max(lx[i],w[i][j]);}for (int i=1;i<=n;i++){for (int j=1;j<=n;j++) sla[j]=1<<30;for (;;){cl(S); cl(T); if (match(i)) break;int a=1<<30;for (int j=1;j<=n;j++) if (!T[j]) a=min(a,sla[j]);for (int j=1;j<=n;j++) if (S[j]) lx[j]-=a;for (int j=1;j<=n;j++) if (T[j]) ly[j]+=a; else sla[j]-=a;}}int ret=0;for (int i=1;i<=n;i++) if (boy[i]) ret+=w[boy[i]][i];return ret;}
}const int N=705;struct edge{int u,v; int next;
}G[N<<1];
int head[N],inum;
inline void add(int u,int v,int p){G[p].u=u; G[p].v=v; G[p].next=head[u]; head[u]=p;
}int n,ru[N],rv[N];
int size[N];
int minimum,rt[2],rot;#define U G[p].u
#define V G[p].v
void Root(int u,int fa){int maximum=0; size[u]=1;for (int p=head[u];p;p=G[p].next)if (V!=fa)Root(V,u),maximum=max(maximum,size[V]),size[u]+=size[V];maximum=max(maximum,n-size[u]);if (maximum==minimum) rt[1]=u;if (maximum<minimum) minimum=maximum,rt[0]=u,rt[1]=0;
}const int pri[]={0,2,23,29,37,53,67,73,79,83,89,97};ull H[N],tmp[N];
int fat[N],depth[N];
void Hash(int u,int fa){fat[u]=fa; depth[u]=depth[fa]+1;for (int p=head[u];p;p=G[p].next)if (V!=fa)Hash(V,u);int pnt=0;for (int p=head[u];p;p=G[p].next)if (V!=fa)tmp[++pnt]=H[V];sort(tmp+1,tmp+pnt+1);H[u]=1;for (int i=1;i<=pnt;i++)H[u]+=tmp[i]*pri[i];
}int a[N];
bool cmp(int x,int y){return depth[x]==depth[y]?H[x]<H[y]:depth[x]>depth[y];
}
bool jud(int x,int y){return depth[x]==depth[x] && H[x]==H[y];
}int ans,f[N][N];
int ch1[15],ch2[15],tot;
int sm[N],tm[N];int main()
{freopen("t.in","r",stdin);freopen("t.out","w",stdout);read(n);for (int i=1;i<n;i++)read(ru[i]),read(rv[i]),add(ru[i],rv[i],++inum),add(rv[i],ru[i],++inum);for (int i=1;i<=n;i++) read(sm[i]);for (int i=1;i<=n;i++) read(tm[i]);minimum=1<<30; Root(1,0);if (rt[0] && rt[1]){rot=++n;cl(head); inum=0;for (int i=1;i<=n-2;i++)if ((ru[i]==rt[0] && rv[i]==rt[1]) || (ru[i]==rt[1] && rv[i]==rt[0]))add(ru[i],n,++inum),add(n,ru[i],++inum),add(rv[i],n,++inum),add(n,rv[i],++inum);elseadd(ru[i],rv[i],++inum),add(rv[i],ru[i],++inum);}elserot=rt[0];Hash(rot,0);for (int i=1;i<=n;i++) a[i]=i;sort(a+1,a+n+1,cmp);for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) f[i][j]=1<<25;int l,r;for (l=1;l<=n;l=r+1){r=l;while (r+1<=n && jud(a[r],a[r+1])) r++;for (int i=l;i<=r;i++)for (int j=l;j<=r;j++){tot=0;for (int p=head[a[i]];p;p=G[p].next)if (V!=fat[a[i]])ch1[++tot]=V;tot=0;for (int p=head[a[j]];p;p=G[p].next)if (V!=fat[a[j]])ch2[++tot]=V;KMA::n=tot;for (int x=1;x<=tot;x++)for (int y=1;y<=tot;y++)KMA::w[x][y]=-f[ch1[x]][ch2[y]];f[a[i]][a[j]]=-KMA::KM()+(sm[a[i]]^tm[a[j]]);}}ans=f[rot][rot];printf("%d\n",ans);return 0;
}

[KM 树同构Hash DP] BZOJ 3197 [Sdoi2013]assassin相关推荐

  1. [BZOJ3197][Sdoi2013]assassin(树形DP+树同构+二分图最优匹配)

    关于树同构,有一个神奇的性质: 一棵树的重心只有 111 个或 2" role="presentation" style="position: relative ...

  2. P5043 【模板】树同构([BJOI2015]树的同构) 树的hash

    题意 对于两个树 T1T_1T1​ 和 T2T_2T2​,如果能够把树 T1T_1T1​ 的所有点重新标号,使得树 T1T_1T1​ 和树 完 T2T_2T2​ 全相同,那么这两个树是同构的.给你多棵 ...

  3. 洛谷 - P5043 【模板】树同构([BJOI2015]树的同构)(树上哈希)

    题目链接:点击查看 题目大意:给出 m 棵树,对于第 i 棵树而言,找到 1 ~ i 中与当前树同构的最小 id 题目分析:判断有向树同构,可以预处理出质数数组 p ,然后树形 dp ,设 u 为当前 ...

  4. POJ 1635 Subway tree systems 树的Hash 或 树的最小表示法

    题目大意: 就是给出从树的中心开始的dfs序, 根据两个dfs序列判断两棵树是否同构 大致思路: 首先根据dfs一直是从树的中心开始的, 所以不用担心中心的问题, 用树的Hash的话当然可以做 另外一 ...

  5. 哈希算法在判定树同构方面的应用(上)

    哈希算法在判定树同构方面的应用(上) (一)需要掌握的前置知识: (1)素数筛法:埃氏筛或者欧拉筛均可以. 以下为欧拉筛: const int maxn=100100; int p[maxn],cnt ...

  6. 【树的哈希/树同构】2019-2020 ICPC, Asia Jakarta Regional Contest - F. Regular Forestation

    题目链接https://codeforces.com/contest/1252/problem/F 题意 给出一棵树,问删去一个度大于1的节点,使得剩下的树两两同构.问剩下的树最多是多少. 题解 容易 ...

  7. 哈希算法在判定树同构方面的应用(下)

    哈希算法在判定树同构方面的应用 在上一篇文章中我们介绍了 枚举根节点哈希 和 求重心哈希 两种方法来判断两棵无根树是否同构. 但是如果有些题目中我必须要计算出每个根节点的 fff 值,且 n≤1e5n ...

  8. C++ __gnu_pbds(平板电视)超详细教程(C++内置的平衡树,字典树,hash)

    整理的算法模板合集: ACM模板 目录 一.平衡树 例题:luogu P3369 [模板]普通平衡树 1. `rb_tree_tag`版 2. `splay_tree_tag`版 功能不够?自己添加! ...

  9. [数位dp] bzoj 3209 花神的数论题

    [数位dp] bzoj 3209 花神的数论题 题意:中文题. 思路:和普通数位dp一样,这里转换成二进制,然后记录有几个一. 统计的时候乘起来就好了. 代码: #include"cstdl ...

  10. 线段树 + 字符串Hash - Codeforces 580E Kefa and Watch

    Kefa and Watch Problem's Link Mean: 给你一个长度为n的字符串s,有两种操作: 1 L R C : 把s[l,r]全部变为c; 2 L R d : 询问s[l,r]是 ...

最新文章

  1. MySQL8索引篇:性能提升了100%!!
  2. Window VNC远程控制LINUX:VNC详细配置介绍
  3. The data replication requires the processing of single BDoc instances
  4. Request获取url各种信息的方法
  5. mach-o hook
  6. 惠普暗影精灵3清灰_如何评价惠普笔记本这几年的表现?尤其是暗影精灵系列。...
  7. WSGI Middleware
  8. 走在“辞职”路上的数据科学家们!
  9. 获得阿里巴巴编码规范技能认证
  10. MS SQL Server 事务回滚处理!
  11. codeforces-1009D Relatively Prime Graph
  12. 俄罗斯方块游戏开发教程1:整体流程
  13. 云锁linux宝塔安装,【最新版】宝塔面板下为Nginx自编译云锁Web防护模块教程
  14. JAVA:实现PigeonholeSort鸽巢排序算法(附完整源码)
  15. python文件批量改名
  16. php微信调用摄像头拍视频,公众号调用摄像头录制视频
  17. LVS均衡负载(一) LVS详解
  18. 证明ker f是H中的闭线性子空间(f是连续有界线性泛函)
  19. Confluence 6 管理协同编辑 - 修改你的 Synchrony 配置
  20. 描述计算机组装配置单,细说组装电脑配置清单最新介绍

热门文章

  1. 基于HTML5的在线幻灯片编辑演示系统
  2. 远不止三色,图片被压扁了,用Python的Tkinter做一个既高颜值又好用的计算器
  3. 【重磅】凯文.凯利8个小时演讲实录
  4. 腾讯蔡晨:十年沉淀,腾讯iOA为企业安全保驾护航
  5. 关于“软件设计师”考试的感悟分享
  6. 前端开发日报:20190818
  7. JavaScript设置显示video第一帧
  8. 精简的webservice例子
  9. 串口公头母头: RS232 DB9 公头 母头 串口引脚定义
  10. 云计算数据中心运维管理的五大重点