SHOI 2016 黑暗前的幻想鄉 題解

2021-10-04 02:07:01 字數 1361 閱讀 1719

題目傳送門

題目大意:有 n

nn 個點,n−1

n-1n−

1 個公司,每個公司能修某些給定的邊,現在要求每個公司修一條邊,然後使得 n

nn 個點聯通,問方案數。

在你谷能紫了應該是因為用到了 mat

rix−

tree

matrix-tree

matrix

−tre

e 吧qwq

如果知道這個演算法,那麼這題其實再套乙個簡單的容斥即可:至少 0

00 個公司沒路建−

-−至少 1

11 個公司沒路建+

++至少 2

22 個公司沒路建−..

.-...

−...

每次列舉出一些沒路建的公司時,將其他公司的邊全部湊在一起弄成一張圖,跑一次 mat

rix−

tree

matrix-tree

matrix

−tre

e 算生成樹個數即可。(什麼?你不會 mat

rix−

tree

matrix-tree

matrix

−tre

e?那就來這裡康康吧)

**如下:

#include

#include

#include

using

namespace std;

#define maxn 20

#define mod 1000000007

int n,m[maxn]

;struct edge

;edge e[maxn]

[maxn*maxn]

;int f[maxn]

[maxn]

,ans=0;

intdet

(int l)if(

!f[i]

[i])

return0;

re=1ll*re*f[i]

[i]%mod;

} re=

(1ll

*re*fu+mod)

%mod;

return re;

}int

main()

for(

int i=

0;i<(1

<<

(n-1))

;i++)}

ans=

(1ll

*ans+fu*

det(n-1)

+mod)

%mod;

}printf

("%d"

,ans)

;}

SHOI2016 黑暗前的幻想鄉

點此看題 好久沒有做過這麼版的題了 首先你要知道指數級容斥,也就是我們列舉乙個公司集合,表示我們只在這些公司中選邊,那麼我們就用全部公司 少乙個公司 少兩個公司 來計算就行。知道邊算生成樹,不就是矩陣樹定理麼?include include include include using namespa...

SHOI2016 黑暗前的幻想鄉

幻想鄉是個什麼東西?逃 就是設 dp i 表示至多i個公司修建道路,那麼我們有 ans dp n 1 dp n 2 dp n 3 balabala 就是那個容斥公式嘛qwqwq 然後每次都跑一次矩陣樹定理qwqwq 但是這樣的時間複雜度是 o n 32 所以說。跑的。2s。很勉強qwqwq 如下 i...

SHOI2016 黑暗前的幻想鄉

如果沒有建築公司的限制,那麼就是個 mathrm 板子 其實有了也一樣 發現 n leq 17 考慮容斥 每次欽定一些建築公司,計算它們包含的邊的生成樹的方案數 複雜度 mathrm 2 nn 3 include include include include define rg register ...