P4208 JSOI2008 最小生成樹計數

2022-03-03 22:37:50 字數 1944 閱讀 8317

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

摘自大佬部落格:

find並查集

inline int pls(int a, int b) //

模數不為質數的操作

inline int sub(int a, int b)

inline

int det(int n)//

返回縮點的生成樹個數

}if (!g[i][i])

return0;

tp = tp * g[i][i] %p;

}return pls(p, f *tp);

}inline

void calc()//

合併聯通塊形成縮點

fp(i,

1, n) if (s[i].size() > 1

)

}ans = ans * det(t - 1) %p;

fp(j,

1, t) bl[a[j - 1]] = i;//

屬於同一聯通塊

} fp(i,

1, n) s[i].clear(), fa[i] = bl[i] =gf(i, bl);

}inline

bool cmp(const eg &a, const eg &b)

intmain()

}calc();

fp(i,

2, n) if (bl[i] ^ bl[i - 1]) return puts("

0"), 0

; printf("%d

", ans);

return0;

}

P4208 JSOI2008 最小生成樹計數

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

P4208 JSOI2008 最小生成樹計數

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

P4208 JSOI2008 最小生成樹計數

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