bzoj1211 HNOI2004 樹的計數

2022-05-21 14:24:15 字數 874 閱讀 2033

(題目鏈結)

乙個有n個結點的樹,設它的結點分別為v1, v2, …, vn,已知第i個結點vi的度數為di,問滿足這樣的條件的不同的樹有多少棵。給定n,d1, d2, …, dn,程式設計需要輸出滿足d(vi)=di的樹的個數。

prufer序列,明明的煩惱簡化版。

// bzoj1211

#include#include#include#include#include#include#include#define inf 2147483640

#define ll long long

#define free(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout);

using namespace std;

inline ll getint()

while (ch>='0' && ch<='9')

return x*f;

}const int maxn=200;

int d[maxn],a[maxn],np[maxn],n;

void pls(int x,int f)

int main()

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

d[i]--;

sum+=d[i];

pls(d[i],-1);

}if (sum!=n-2)

ll ans=1;

pls(sum,1);

for (int i=2;i<=150;i++)

for (int j=1;j<=a[i];j++) ans*=(ll)i;

printf("%lld",ans);

return 0;

}

bzoj 1211 HNOI2004 樹的計數

題意 給出每個節點的度數,問有多少棵樹滿足這些度數。題解 pr fer序列 組合數學 pr fer序列是由標號樹產生的唯一數列。生成方法 一棵樹要得到普呂弗序列,方法是逐次去掉樹的頂點,直到剩下兩個頂點。考慮樹t,其頂點為。在第i步,去掉標號最小的葉,並把普呂弗序列的第i項設為這葉的鄰頂點的標號。序...

BZOJ 1211 HNOI2004 樹的計數

今天早上由於剩下的非許可權題實在是太難了。於是學了一下新東西續命。直接prufer序列排列組合就好了。注意各種0的情況 code include include typedef long long ll const ll n 155 ll n ll a n ll pri n ll tot ll cn...

bzoj1211 HNOI2004 樹的計數

題目傳送門 解法 prufer數列。有這麼三個性質 乙個prufer數列與乙個無根樹一一對應。乙個n個節點的無根樹的prufer數列長度為n 2。乙個點的度數等於他在prufer數列裡面出現的次數 1。第三個性質這樣證明 首先需要了解prufer序列如何構造 看這裡在prufer數列中,如果乙個點出...