同構樹計數 構造

2022-05-20 01:42:44 字數 1525 閱讀 1630

8首先要知道一棵樹的同構數量 x

x 可以表示為 x=∏

ai!(

ai∈n

)x=∏

ai​!

(ai​

∈n),

如下圖為乙個例子,

!/於是考慮將 k

k 分解為若干個菊花圖, 使得兩兩菊花圖之間互不對稱, 使得每個菊花子樹大小的階乘乘起來為 k

k, 如下圖所示,

為了防止子樹之間對稱, 在鏈後方加兩個點 .

#include

#define reg register

typedef

long

long ll;

const

int maxn =

100005

;int cnt;

int flag;

int size[maxn]

;ll k;

ll fac[maxn]

;void

dfs(ll now,

int k)

for(reg int i = k; i >=

2; i --)}

void

work()

flag = cnt =0;

dfs(k,19)

;if(!flag)

int sum =2;

for(reg int i =

1; i <= cnt; i ++

) sum +

= size[i]+1

;printf

("%d\n"

, sum)

;for

(reg int i =

1; i < cnt; i ++

)printf

("%d %d\n"

, i, i +1)

;int node_cnt = cnt;

for(reg int i =

1; i <= cnt; i ++

)for

(reg int j =

1; j <= size[i]

; j ++

)printf

("%d %d\n"

, i,

++ node_cnt)

;printf

("%d %d\n"

, cnt,

++ node_cnt)

;printf

("%d %d\n"

, node_cnt, node_cnt +1)

;}intmain()

樹同構 樹雜湊

對於無根樹,由於資料範圍較小,可以直接以每個點為根dfs一次,維護其樹雜湊的值,然後用並查集維護 若資料範圍大一些,可以以樹的重心跑dfs include 樹雜湊 define m 100009 define ll unsigned long long using namespace std int...

樹 樹的同構

給定兩棵樹t1和t2。如果t1可以通過若干次左右孩子互換就變成t2,則我們稱兩棵樹是 同構 的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點a b g的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。圖1 圖2輸入給出2棵二叉樹樹的資訊。對於每棵樹,首先在一行中給出乙個非負整數n...

樹1 樹的同構

給定兩棵樹t1和t2。如果t1可以通過若干次左右孩子互換就變成t2,則我們稱兩棵樹是 同構 的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點a b g的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。圖1圖2 現給定兩棵樹,請你判斷它們是否是同構的。輸入給出2棵二叉樹樹的資訊。對...