【codeforces】718D. Andrew and Chemistry 【树同构】
来源:互联网 发布:js屏蔽鼠标右键菜单 编辑:程序博客网 时间:2024/06/05 00:19
题目链接:D. Andrew and Chemistry
题意:问加一个叶子后树的方案数,同构的算一种。
树同构模板题,同构的儿子选一个走就好。
#include <bits/stdc++.h>using namespace std ;typedef long long LL ;#define clr( a , x ) memset ( a , x , sizeof a )const int MAXN = 100005 ;const int MAXE = 1000005 ;const int mod = 998244353 ;const LL seed = 9493101 ;const LL M = 1e9 + 9 ;struct Edge { int v , n ; Edge () {} Edge ( int v , int n ) : v ( v ) , n ( n ) {}} ;int cnt ;vector < int > G[MAXN] ;vector < pair < int , int > > H[MAXN] ;int h[MAXN] , p[MAXN] , siz[MAXN] ;int n ;int X , X2 ;int ans ;int dist ;void predfs ( int u , int f , int dis ) { if ( dis > dist ) { dist = dis ; X = u ; } for ( int i = 0 ; i < G[u].size () ; ++ i ) { int v = G[u][i] ; if ( v == f ) continue ; p[v] = u ; predfs ( v , u , dis + 1 ) ; }}void dfs1 ( int u , int f ) { H[u].clear () ; siz[u] = 1 ; h[u] = 1 ; int leaf = 1 ; for ( int i = 0 ; i < G[u].size () ; ++ i ) { int v = G[u][i] ; if ( v == f ) continue ; leaf = 0 ; dfs1 ( v , u ) ; siz[u] += siz[v] ; H[u].push_back ( make_pair ( h[v] , v ) ) ; } if ( !leaf ) { sort ( H[u].begin () , H[u].end () ) ; int cnt = 1 ; h[u] = ( 1LL * h[u] * H[u][0].first ) % mod ; for ( int i = 1 ; i < H[u].size () ; ++ i ) { h[u] = ( 1LL * h[u] * H[u][i].first ) % mod ; } } h[u] = ( 1LL * h[u] + siz[u] ) % M ; h[u] = ( 1LL * h[u] * h[u] ) % mod ;}void dfs ( int u , int f , int num ) { int t = H[u].size () ; if( num + t < 4 ) ++ ans ; for ( int i = 0 ; i < t ; ++ i ) { if ( !i || H[u][i].first != H[u][i - 1].first ) dfs ( H[u][i].second , u , 1 ) ; }}void solve () { cnt = 0 ; for ( int i = 1 ; i <= n ; ++ i ) { G[i].clear () ; } for ( int i = 1 ; i < n ; ++ i ) { int u , v ; scanf ( "%d%d" , &u , &v ) ; G[u].push_back ( v ) ; G[v].push_back ( u ) ; } dist = -1 ; predfs ( 1 , 0 , 0 ) ; dist = -1 ; predfs ( X , 0 , 0 ) ; int f = dist & 1 ; dist >>= 1 ; while ( dist -- ) X = p[X] ; X2 = X ; if ( f ) X = p[X] ; dfs1 ( X , X2 ) ; if ( X != X2 ) dfs1 ( X2 , X ) ; ans = 0 ; if ( X == X2 ) { dfs ( X , X2 , 0 ) ; } else if ( h[X] == h[X2] ) { dfs ( X , X2 , 1 ) ; } else { dfs ( X , X2 , 1 ) ; dfs ( X2 , X , 1 ) ; } printf ( "%d\n" , ans ) ;}int main () { while ( ~scanf ( "%d" , &n ) ) solve () ; return 0 ;}
0 0
- 【codeforces】718D. Andrew and Chemistry 【树同构】
- CodeForces Round 718D - Andrew and Chemistry
- [Codeforces Round #373 DIV1D (CF718D)] Andrew and Chemistry
- codeforces 558 C Amr and Chemistry
- Codeforces 558C Amr and Chemistry 规律
- Codeforces 558C Amr and Chemistry
- Codeforces 558C Amr and Chemistry 暴力 - -
- codeforces 558C Amr and Chemistry
- Codeforces Amr and Chemistry(数学+乱搞)
- Codeforces 558C - Amr and Chemistry (枚举)
- Codeforces 558C Amr and Chemistry
- 【23.39%】【codeforces 558C】Amr and Chemistry
- Codeforces 558C Amr and Chemistry 位操作
- Codeforces 558C Amr and Chemistry 全都变相等
- C. Amr and Chemistry(Codeforces Round #312(div2))
- Codeforces Round #312 (Div. 2) C. Amr and Chemistry
- Codeforces 558C Amr and Chemistry(dp)
- Codeforces 558C Amr and Chemistry(数论+位运算)
- SAR数据处理中常用的软件
- 第五周项目3-括号的匹配
- 萨瓦迪卡·泰游记
- vb中的变量名区分大小写吗?
- 第七周-项目一 建立顺序环形队列算法库
- 【codeforces】718D. Andrew and Chemistry 【树同构】
- java 环境变量配置
- Java学习总结第十九天Java接口
- 线段树 区间更新模板
- 鸡汤分享--如何成为高手
- linux中的find命令——查找文件名
- java中map list转换json类型回传到前端
- 第五周 项目5 后缀表达式
- oracle基础教程(第四天)数据库管理