P4208 JSOI2008 最小生成樹計數

2022-07-19 03:27:13 字數 989 閱讀 3033

題目描述

現在給出了乙個簡單無向加權圖。你不滿足於求出這個圖的最小生成樹,而希望知道這個圖中有多少個不同的最小生成樹。(如果兩顆最小生成樹中至少有一條邊不同,則這兩個最小生成樹就是不同的)。由於不同的最小生成樹可能很多,所以你只需要輸出方案數對\(31011\)的模就可以了。

容易想到對於邊權相同的那些邊,選出來的邊數是一定的,所以最終答案其實就是各個邊權相同的部分的方案數的乘積,用並查集維護\(dfs\)即可,注意:由於有撤銷操作,所以不能進行路徑壓縮。

#include #include #include using namespace std;

const int n = 1005;

const int mod = 31011;

int n, m, fa[n], cnt, tot, sum, ans = 1, now;

struct nodea[n];

struct datae[n];

inline int read()

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

return x * f;

}bool cmp(const node & a, const node & b)

int find(int x)

void dfs(int x, int goal, int num)

int xx = find(a[x].x), yy = find(a[x].y);

if(xx != yy)

dfs(x + 1, goal, num);

}int main()

} e[cnt].r = m; if(tot != n - 1)

for(int i = 1; i <= n; i ++) fa[i] = i;

for(int i = 1; i <= cnt; i ++) }

printf("%d\n", ans);

return 0;

}

P4208 JSOI2008 最小生成樹計數

現在給出了乙個簡單無向加權圖。你不滿足於求出這個圖的最小生成樹,而希望知道這個圖中有多少個不同的最小生成樹。如果兩顆最小生成樹中至少有一條邊不同,則這兩個最小生成樹就是不同的 輸出方案數對31011的模 摘自大佬部落格 find並查集 inline int pls int a,int b 模數不為質...

P4208 JSOI2008 最小生成樹計數

這題竟然不是生成樹計數?直接暴力就行。我們需要知道乙個性質,就是最小生成樹無論長成啥樣,邊權數量是一定的。然後用乘法原理一算就行啦。好像還有生成樹計數的作法,太麻煩了,就不寫了。題幹 題目描述 現在給出了乙個簡單無向加權圖。你不滿足於求出這個圖的最小生成樹,而希望知道這個圖中有多少個不同的最小生成樹...

P4208 JSOI2008 最小生成樹計數

思路 剛看到的時候,因為 n leq 100 所以想到了爆搜,但是這樣做顯然會 tle 所以我們手摸幾組資料找找結論 然後能發現乙個結論 一張圖上的不同最小生成樹中,權值相等的邊的個數是不變的 小證明 用kruskal求最小生成樹時,每一步都是最優的,如果有不同的最小生成樹,則當前步的權值必然小於等...