JSOI 2008 最小生成樹計數 題解

2021-10-08 03:31:44 字數 1586 閱讀 2320

題目傳送門

題目大意:求一張圖有多少棵最小生成樹。

最小生成樹有個性質,就是每種長度的邊的數量是固定的。

所以先隨便找一棵最小生成樹,考慮長度為 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的模就可以了。輸...