枚举$T_1$的树根,然后DP,设$f[i][j]$表示$T_1$的子树$i$是否存在包括i的连通子树与$T_2$的子树$j$同构。

若$j$是叶子,那么显然可以。

若$deg_i<deg_j$,那么显然不可以。

否则将$i$与$j$所有互相同构的儿子之间连边,二分图匹配判断是否存在完美匹配即可。

#include<cstdio>
#include<algorithm>
const int N=105;
int T,C,n,m,o,i,j,k,x,y;
int g[N],v[N<<1],nxt[N<<1],ed,f[N],d[N],deg[N],q[N];
int G[N],V[N<<1],NXT[N<<1],ED,F[N],D[N],DEG[N],Q[N];
bool dp[N][N],ok[N][N],b[N];int p[N];
inline bool cmp(int x,int y){return d[x]>d[y];}
inline bool CMP(int x,int y){return D[x]>D[y];}
inline void add(int*g,int*v,int*nxt,int&ed,int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
void dfs(int x,int y,int*f,int*d,int*deg,int*g,int*v,int*nxt){
f[x]=y,d[x]=d[y]+1;deg[x]=0;
for(int i=g[x];i;i=nxt[i])if(v[i]!=y)deg[x]++,dfs(v[i],x,f,d,deg,g,v,nxt);
}
bool find(int x){
for(int i=1;i<=o;i++)if(!b[i]&&ok[x][i]){
b[i]=1;
if(!p[i]||find(p[i]))return p[i]=x,1;
}
return 0;
}
inline void DP(int x,int y){
dp[x][y]=0;
if(deg[x]<DEG[y])return;
if(!DEG[y]){dp[x][y]=1;return;}
int n=o=0,i,j,cnt=0;
static int A[N],B[N];
for(i=g[x];i;i=nxt[i])if(v[i]!=f[x])A[++n]=v[i];
for(i=G[y];i;i=NXT[i])if(V[i]!=F[y])B[++o]=V[i];
for(i=1;i<=n;i++)for(j=1;j<=o;j++)ok[i][j]=dp[A[i]][B[j]];
for(i=1;i<=o;i++)p[i]=0;
for(i=1;i<=n;i++){
for(j=1;j<=o;j++)b[j]=0;
if(find(i)){
cnt++;
if(cnt==o){dp[x][y]=1;return;}
}
}
}
bool solve(){
scanf("%d",&n);
for(ed=0,i=1;i<=n;i++)g[i]=0,q[i]=i;
for(i=1;i<n;i++)scanf("%d%d",&x,&y),add(g,v,nxt,ed,x,y),add(g,v,nxt,ed,y,x);
scanf("%d",&m);
for(ED=0,i=1;i<=m;i++)G[i]=0;
for(i=1;i<m;i++)scanf("%d%d",&x,&y),add(G,V,NXT,ED,x,y),add(G,V,NXT,ED,y,x);
dfs(1,0,F,D,DEG,G,V,NXT);
for(i=1;i<=m;i++)Q[i]=i;
std::sort(Q+1,Q+m+1,CMP);
for(i=1;i<=n;i++){
dfs(i,0,f,d,deg,g,v,nxt);
std::sort(q+1,q+n+1,cmp);
for(j=1;j<=n;j++)for(k=1;k<=m;k++)DP(q[j],Q[k]);
if(dp[i][1])return 1;
}
return 0;
}
int main(){
for(scanf("%d",&T);T--;puts(solve()?"YES":"NO"));
return 0;
}

  

BZOJ2368 : Modern Art Plagiarism 树同构的更多相关文章

  1. uva12489 Combating cancer(树同构)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud https://uva.onlinejudge.org/index.php?opt ...

  2. BZOJ4337: BJOI2015 树的同构(hash 树同构)

    题意 题目链接 Sol 树的同构问题,直接拿hash判一下,具体流程大概是这样的: 首先转化为有根树,预处理出第\(i\)棵树以\(j\)为根时的hash值. 那么两个树同构当且仅当把两棵树的hash ...

  3. bzoj 4780: [Usaco2017 Open]Modern Art 2

    4780: [Usaco2017 Open]Modern Art 2 Time Limit: 10 Sec  Memory Limit: 128 MB Description Having becom ...

  4. lesson 18 Electric currents in modern art

    lesson18 Electric currents in modern art electricity n. 电力:电流; electric adj. 电的:电动的; electronic adj. ...

  5. Luogu 5043 【模板】树同构([BJOI2015]树的同构)

    BZOJ 4337 简单记录一种树哈希的方法:以$x$为根的子树的哈希值为$\sum_{y \in son(x)}f_y*base_i$,$f_y$表示以$y$为根的树的哈希值,其中$i$表示$f_y ...

  6. 洛谷P3668 [USACO17OPEN]Modern Art 2 现代艺术2

    P3668 [USACO17OPEN]Modern Art 2 现代艺术2 题目背景 小TY的同学HF也想创作艺术 HF只有一块长条状的画布(画条),所以每一次涂色只能涂上连续几个单位的颜料,同样新的 ...

  7. 『Andrew and Chemistry 树同构』

    Andrew and Chemistry Description During the chemistry lesson Andrew learned that the saturated hydro ...

  8. 【CF1252F】Regular Forestation(重心,树同构)

    题意:给定一棵n个点的树,问删去某个点之后所有的树同构,这样分割出来的树最多能有几棵 n<=4000 思路:分割成至少两个size相等的联通块之后size必定小于n/2,与树的重心的定义相同 预 ...

  9. luogu P5043 【模板】树同构 hash 最小表示法

    LINK:模板 树同构 题目说的很迷 给了一棵有根树 但是重新标号 言外之意还是一棵无根树 然后要求判断是否重构. 由于时无根的 所以一个比较显然的想法暴力枚举根. 然后做树hash或者树的最小表示法 ...

随机推荐

  1. 目标检测算法之YOLOv3

    参考地址:https://blog.csdn.net/leviopku/article/details/82660381 YOLO v3结构图 DBL:卷积+BN+leaky relu,是v3的最小组 ...

  2. SQLServer 表连接种类

    SQLServer 有3种物理连接:Nested Loop(嵌套循环).Merge Join(合并联接).Hash Join(哈希联接). T-SQL中的inner/left/right/full j ...

  3. constructor与prototype

    在学习JS的面向对象过程中,一直对constructor与prototype感到很迷惑,看了一些博客与书籍,觉得自己弄明白了,现在记录如下: 我们都知道,在JS中有一个function的东西.一般人们 ...

  4. BZOJ5084[hashit]

    题解: 后缀自动机 我们可以通过建立trie 把询问变成询问一些点的并 把trie建立成SAM和广义SAM基本相同,就是在父亲和儿子之间连边 然后就变成了询问树链的并 我们可以发现答案=sigma d ...

  5. 2018项目UML设计-课堂实战

    1. 团队信息 队名:小白吃队 成员: 卢泽明 031602328 蔡文斌 031602301 葛亮 031602617 刘浩 031602423 张扬 031602345 李泓 031602321 ...

  6. .net core2.1 - ef core数据库迁移,初始化种子数据

    起因:早上偶然看见一篇文章说是ef core(2.x)使用种子数据,主表子表迁移时候,正常情况下说是无法迁移成功,索性就试试,结果是和ef6的一样,没感觉有什么大的区别.一切OK,见下面内容. 1.首 ...

  7. 【转】如何向Android模拟器打电话发短信

    转载地址:http://hi.baidu.com/jeremylai/item/420f9c9fe4881fccb62531f7 1. 启动Android Emulator, 查看标题栏找出端口.一般 ...

  8. python --判断列表重复

    一.判断单个列表中的元素是否存在重复 使用set方法去重后,和原list进行对比,如果相等,那么说明原列表无重复,如果存在重复,说明列表存在重复 def is_repect_all(L): repea ...

  9. spring ,springmvc,mybatis 最基本的整合,没有多余的jar包和依赖 2018.9.29日

    最基本的ssm框架整合 本案例采用2018商业版intellij  idea  编辑器    maven项目管理工具  tomcat8.5 接着上一篇使用springmvc最基本配置开始 https: ...

  10. 同构体字符串(如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。 所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。)

    示例 1: 输入: s = "egg", t = "add" 输出: true 示例 2: 输入: s = "foo", t = " ...