題目傳送門
題目大意:求一張圖有多少棵最小生成樹。
最小生成樹有個性質,就是每種長度的邊的數量是固定的。
所以先隨便找一棵最小生成樹,考慮長度為 i
ii 的邊,先將長度不為 i
ii 的最小生成樹中的邊加入進去,然後就形成了若干個連通塊,然後剩下的問題就是用長度為 i
ii 的邊將這些連通塊連成一棵樹有多少種方案,顯然用矩陣樹定理就能求。
最後將每種長度的方案數乘起來就是答案了。
**如下:
#include
#include
#include
using
namespace std;
#define maxn 110
#define mod 31011
int n,m,ans=1;
struct edgee[
1010];
int belong[maxn]
;bool v[
1010];
struct bcj
intfindfa
(int x)
bool
linked
(int x,
int y)
bool
link
(int x,
int y)
}f;bool
cmp(edge x,edge y)
intdec
(int x)
int f[maxn]
[maxn]
;int
det(
int l)
re=1ll*re*f[i]
[i]%mod;
}return re*fu;
}int
main()
f.init()
;for
(int i=
1;i<=m;i++)if
(v[i]
&&e[i]
.z!=e[now]
.z)f.
link
(e[i]
.x,e[i]
.y);
int id=0;
memset
(belong,0,
sizeof
(belong));
memset
(f,0
,sizeof
(f))
;for
(int i=
1;i<=n;i++)if
(f.fa[i]
==i)belong[i]
=++id;
for(
int i=
1;i<=n;i++
)belong[i]
=belong[f.
findfa
(i)]
;for
(int i=now;i) ans=
1ll*ans*
det(id-1)
%mod;now=to;
}printf
("%d"
,ans)
;}
JSOI2008 最小生成樹計數
time limit 1 sec memory limit 162 mb 現在給出了乙個簡單無向加權圖。你不滿足於求出這個圖的最小生成樹,而希望知道這個圖中有多少個不同的 最小生成樹。如果兩顆最小生成樹中至少有一條邊不同,則這兩個最小生成樹就是不同的 由於不同的最小生 成樹可能很多,所以你只需要輸出...
JSOI2008 最小生成樹計數
bzoj luogu 根據最小生成樹的一些性質,不同的最小生成樹固定權值的邊數是一樣的 而且我們發現這題同權的邊數 10 於是可以預處理出每種權值需要多少條邊,然後爆搜 然後不能路徑壓縮,不然你怎麼回溯.注意到n只有100,暴力並查集搜根沒有任何問題 複雜度 o 邊權數 2 最壞也就是 100 10...
JSOI2008 最小生成樹計數
jsoi2008 最小生成樹計數 題目描述 現在給出了乙個簡單無向加權圖。你不滿足於求出這個圖的最小生成樹,而希望知道這個圖中有多少個不同的最小生成樹。如果兩顆最小生成樹中至少有一條邊不同,則這兩個最小生成樹就是不同的 由於不同的最小生成樹可能很多,所以你只需要輸出方案數對31011的模就可以了。輸...