prufer序列就是一一對應一棵無根樹的乙個序列。
對於一棵 n 個結點的無根樹,它的 prufer序列有 n-2 個數,它們之間相互轉換關係如下:
例如對於如下的一棵樹:
prufer序列主要用於涉及到樹的度數時的一些計數問題,它有一些重要的性質:
用 prufer序列處理樹的計數問題時,要始終明白 prufer序列和無根樹是一一對應的,可以用 prufer序列唯一地表示一棵樹。
比如這道例題 valuable forests :一棵無根樹的 value 為它所有結點的度數的平方和,乙個森林的 value 為它所有樹的 value 之和。現在給出 n 個結點,要求所有可能組成森林的 value 之和。
定義四個陣列 f,g,f,g,它們的意義如下:
那麼有如下四個式子成立:
這樣就可以計算出來了。
**:
#define din freopen("input.txt","r",stdin);
#define dout freopen("output.txt","w",stdout);
#include
#include
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(int i=(a);i<=(int)(b);i++)
#define rep_(i,a,b) for(int i=(a);i>=(b);i--)
#define pb push_back
using
namespace std;
typedef
long
long ll;
typedef vector<
int> vi;
typedef pair p;
intread()
return flag?x:
-x;}
const
int maxn=
5005
,n=5000
;ll m;
ll f[maxn]
,g[maxn]
,f[maxn]
,g[maxn]
;ll jie[maxn]
,jie_[maxn]
;ll ksm
(ll x,ll n)
return ret;
}ll c
(ll n,ll m)
intmain()
rep(k,
1,n)
//g[0]=g[1]=1;
rep(k,
1,n)
while
(t--
)return0;
}
prufer序列複習小結
快要省選了。抽點時間複習一下東西 以免漏了一些東西 為了在省選之前覺得自己什麼都會 每一次選擇乙個編號最小,並且度數為1的點 把它刪掉 然後讓他唯一連向的點加入prufer序列 如果只有兩個點就結束 這個的話,你可以理解為有乙個陣列a 表示每乙個數在prufer裡面出現的次數 然後每一次,你就選出p...
Prufer序列相關
最近做到一些題,用到了prufer序列,挺有用的,在這裡學習一下。prufer數列是無根樹的一種數列,通過乙個prufer序列可以唯一表示一棵頂點帶標號的無根樹,點數為n的樹轉化來的prufer數列長度為n 2,它有很多的性質 一種生成prufer序列的方法是迭代刪點,直到原圖僅剩兩個點。對於一棵頂...
prufer 序列 學習筆記
上周五看了一下,發現不是很難,今天再看了一眼,把板題做了,順便看了另外一道 懶得碼了 其實很簡單,我們定義一顆無根樹的 prufer 序列為,欽定任意乙個點為根 方便確定父子關係 每次從葉子中選出乙個編號最小的點,把它的父親加入到 prufer 序列中,並刪掉該節點。不難看出,我們最後會有 n 2 ...