1. 程式人生 > >BZOJ1005--[HNOI2008]明明的煩惱(樹的prufer編碼)

BZOJ1005--[HNOI2008]明明的煩惱(樹的prufer編碼)

data 我們 memory 滿足 允許 bsp logs 輸入 www

  

1005: [HNOI2008]明明的煩惱

Time Limit: 1 Sec Memory Limit: 162 MB
Submit: 5768 Solved: 2253
[Submit][Status][Discuss]

Description

  自從明明學了樹的結構,就對奇怪的樹產生了興趣......給出標號為1到N的點,以及某些點最終的度數,允許在
任意兩點間連線,可產生多少棵度數滿足要求的樹?

Input

  第一行為N(0 < N < = 1000),
接下來N行,第i+1行給出第i個節點的度數Di,如果對度數不要求,則輸入-1

Output

  一個整數,表示不同的滿足要求的樹的個數,無解輸出0

Sample Input

3
1
-1
-1

Sample Output

2

HINT

  兩棵樹分別為1-2-3;1-3-2

轉自怡紅公子(http://www.cnblogs.com/noip/archive/2013/03/10/2952520.html)----

該題運用到了樹的prufer編碼的性質: (1)樹的prufer編碼的實現 不斷 刪除樹中度數為1的最小序號的點,並輸出與其相連的節點的序號 直至樹中只有兩個節點 (2)通過觀察我們可以發現 任意一棵n節點的樹都可唯一的用長度為n-2的prufer編碼表示 度數為m的節點的序號在prufer編碼中出現的次數為m-1 (3)怎樣將prufer編碼還原為一棵樹?? 從prufer編碼的最前端開始掃描節點,設該節點序號為 u ,尋找不在prufer編碼的最小序號且沒有被標記的節點 v ,連接 u,v,並標記v,將u從prufer編碼中刪除。掃描下一節點。 該題需要將樹轉化為prufer編碼: n為樹的節點數,d[ ]為各節點的度數,m為無限制度數的節點數。 則 技術分享
所以要求在n-2大小的數組中插入tot各序號,共有技術分享種插法; 在tot各序號排列中,插第一個節點的方法有技術分享種插法; 插第二個節點的方法有技術分享種插法; ......... 另外還有m各節點無度數限制,所以它們可任意排列在剩余的n-2-tot的空間中,排列方法總數為技術分享; 根據乘法原理: 技術分享 然後就要高精度了.....但高精度除法太麻煩了,顯而易見的排列組合一定是整數,所以可以進行質因數分解,再做一下相加減。 關於n!質因數分解有兩種方法,第一種暴力分解,這裏著重講第二種。 若p為質數,則n!可分解為 一個數*技術分享
,其中技術分享技術分享 <n 所以 技術分享  關於prufer編碼: http://www.matrix67.com/blog/archives/682#comment-9435

BZOJ1005--[HNOI2008]明明的煩惱(樹的prufer編碼)