簡單prufer應用

2022-06-03 07:48:06 字數 2136 閱讀 3248

【bzoj1005】

自從明明學了樹的結構,就對奇怪的樹產生了興趣......給出標號為1到n的點,以及某些點最終的度數,允許在

任意兩點間連線,可產生多少棵度數滿足要求的樹?

第一行為n(0 < n < = 1000),

接下來n行,第i+1行給出第i個節點的度數di,如果對度數不要求,則輸入-1

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

-1-1

2關於prufer序列這個定理的證明,

給出大佬部落格

我這裡就給乙個結論

寫到**裡,ok!

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define il inline

#define re register

using

namespace

std;

const

int n=1111

;int

n,m,p,d[n],ans[n],chk[n],pr[n],cnt[n],tot,l;

il void

filt()

}il

void add(int p,int

v) }

}}il

void mul(int

x)

while(ans[l+1]>0)}

intmain()

if(n==1

)

for(int i=1;i<=n;i++)

if(d[i]==-1) m++;

else

}if(p>n-2

) add(n-2,1

); add(n-2-p,-1

);

for(int i=1;i<=n;i++)

if(d[i]>0) add(d[i],-1

); ans[

1]=1;l=1;/*

for(int i=1;i<=tot;i++)

cout

for(int i=1;i<=tot;i++)

//cout

mul(m);

printf("%d

",ans[l]);

for(int i=l-1;i>=1;i--)

printf(

"%06d

",ans[i]);

return0;

}

【bzoj1430】

一開始森林裡面有n只互不相識的小猴子,它們經常打架,但打架的雙方都必須不是好朋友。每次打完架後,打架的雙方以及它們的好朋友就會互相認識,成為好朋友。經過n-1次打架之後,整個森林的小猴都會成為好朋友。 現在的問題是,總共有多少種不同的打架過程。 比如當n=3時,就有六種不同的打架過程。

乙個整數n。

一行,方案數mod 9999991。496

50%的資料n<=10^3。

100%的資料n<=10^6。

【soltuion】

這不是剛剛那題的弱弱弱化版?

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define il inline

#define re register

#define mod 9999991

using

namespace

std;

typedef

long

long

ll;int n,ans=1

;int

main()

我不會告訴你這篇部落格只是乙個刷題記錄

prufer數列學習筆記

學了一種新姿勢叫prufer數列,可以用來解一些關於無根樹計數的問題。prufer數列是一種無根樹的編碼表示,對於一棵n個節點帶編號的無根樹,對應唯一一串長度為n 2的prufer編碼。1 無根樹轉化為prufer序列。首先定義無根樹中度數為1的節點是葉子節點。找到編號最小的葉子並刪除,序列中新增與...

prufer序列複習小結

快要省選了。抽點時間複習一下東西 以免漏了一些東西 為了在省選之前覺得自己什麼都會 每一次選擇乙個編號最小,並且度數為1的點 把它刪掉 然後讓他唯一連向的點加入prufer序列 如果只有兩個點就結束 這個的話,你可以理解為有乙個陣列a 表示每乙個數在prufer裡面出現的次數 然後每一次,你就選出p...

Prufer序列相關

最近做到一些題,用到了prufer序列,挺有用的,在這裡學習一下。prufer數列是無根樹的一種數列,通過乙個prufer序列可以唯一表示一棵頂點帶標號的無根樹,點數為n的樹轉化來的prufer數列長度為n 2,它有很多的性質 一種生成prufer序列的方法是迭代刪點,直到原圖僅剩兩個點。對於一棵頂...