JZOJ4513. 【JSOI2016】独特的树叶
来源:互联网 发布:伞 知乎 编辑:程序博客网 时间:2024/05/15 22:30
题目大意
给两棵树,分别有
Data Constraint
题解
先将树求一个hash(异或一下随便乱搞),然后可以再移根把原树所有可能的hash值求出来,存在一个map里。对于新树,把所有度数为1的节点删掉后看map里是否有相同的hash,求个最小值就行了。
SRC
#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#include<map>using namespace std ;#define N 100000 + 10typedef unsigned long long ll ;const ll Pri = 1e9 + 7 ;map < ll , bool > S ;ll Hash[N] ;int Node[2*N] , Next[2*N] , Head[N] , tot ;int c[N] , Size[N] ;int n , ans = 0x7FFFFFFF ;void link( int u , int v ) { Node[++tot] = v ; Next[tot] = Head[u] ; Head[u] = tot ;}void Build( int x , int F ) { Size[x] = 1 ; for (int p = Head[x] ; p ; p = Next[p] ) { if ( Node[p] == F ) continue ; Build( Node[p] , x ) ; Hash[x] = Hash[x] ^ (Hash[Node[p]] + 17) ; Size[x] += Size[Node[p]] ; } Hash[x] += Size[x] * Pri + 1 ;}void DFS( int x , int F ) { S[Hash[x]] = 1 ; for (int p = Head[x] ; p ; p = Next[p] ) { if ( Node[p] == F ) continue ; ll Ne = ((Hash[x] - n * Pri - 1) ^ (Hash[Node[p]] + 17)) + (n - Size[Node[p]]) * Pri + 1 ; Hash[Node[p]] = ((Hash[Node[p]] - Pri * Size[Node[p]] - 1) ^ (Ne + 17)) + n * Pri + 1 ; Size[Node[p]] = n ; DFS( Node[p] , x ) ; }}void Search( int x , int F ) { for (int p = Head[x] ; p ; p = Next[p] ) { if ( Node[p] == F ) continue ; if ( c[Node[p]] > 1 ) { ll Ne = ((Hash[x] - Size[x] * Pri - 1) ^ (Hash[Node[p]] + 17)) + (Size[x] - Size[Node[p]]) * Pri + 1 ; Hash[Node[p]] = ((Hash[Node[p]] - Pri * Size[Node[p]] - 1) ^ (Ne + 17)) + Size[x] * Pri + 1 ; Size[Node[p]] = Size[x] ; Search( Node[p] , x ) ; } else { ll Ne = ((Hash[x] - Size[x] * Pri - 1) ^ (Hash[Node[p]] + 17)) + (Size[x] - 1) * Pri + 1 ; if ( S.count(Ne) ) ans = min( ans , Node[p] ) ; } }}int main() { scanf( "%d" , &n ) ; for (int i = 1 ; i < n ; i ++ ) { int u , v ; scanf( "%d%d" , &u , &v ) ; link( u , v ) ; link( v , u ) ; } Build( 1 , 0 ) ; DFS( 1 , 0 ) ; tot = 0 ; memset( Head , 0 , sizeof(Head) ) ; for (int i = 1 ; i <= n ; i ++ ) { int u , v ; scanf( "%d%d" , &u , &v ) ; c[u] ++ , c[v] ++ ; link( u , v ) ; link( v , u ) ; } memset( Size , 0 , sizeof(Size) ) ; memset( Hash , 0 , sizeof(Hash) ) ; int st = 1 ; for ( ; st <= n ; st ++ ) if ( c[st] > 1 ) break ; Build( st , 0 ) ; Search( st , 0 ) ; printf( "%d\n" , ans ) ; return 0 ;}
以上.
1 0
- JZOJ4513. 【JSOI2016】独特的树叶
- 【JSOI2016】独特的树叶
- JSOI2016 独特的树叶 树的Hash判同构
- bzoj4754独特的树叶(树hash)
- [Jsoi2016]扭动的回文串
- 扫树叶的小和尚
- 扫树叶的小和尚
- 下落的树叶
- ps树叶的雕刻
- 例题:下落的树叶
- [bzoj4755][JSOI2016]扭动的回文串
- BZOJ4755 [Jsoi2016]扭动的回文串
- 自己的独特内容
- 独特的ARM
- 独特的价值。
- 独特的经历
- android独特的天气预报
- 做独特的自己
- c++6.2
- 第十二周上机实践项目2:Time类中的运算符重载
- leetcode.44. Wildcard Matching
- 软件设计之 单一职责原则(SRP)
- SICP 练习1.31 product过程
- JZOJ4513. 【JSOI2016】独特的树叶
- 感悟:致在大学中感到迷茫或即将进入大学的你
- MyEclipse中项目@Override注解报错问题
- Android学习笔记之TimePicker和DatePicker
- 简易ViewHolder
- Ipython notebook安装
- N皇后问题
- InetAdress,URL类的使用
- 支付宝集成