矩陣樹定理——2025.5.12 鮮花
矩陣樹定理
モニタリング
ねえあたし知ってるよ
きみがひとり“XX”してるの
知ってるよ
ビクンビクン震えてさ
聲もダダ漏れなんだわ
正直に言っちゃえよ
バレてるんだし言っちゃえよ
効いてんの?
普通普通 恥ずかしい?
みんな隠しているだけ
ねえあたし知ってるよ
きみがひとり“涙”してるの
知ってるよ
グスングスン凹んでさ
弱音ヒトカラ in the night
朝が來るまで一緒コース
もっと泣いたって
何度だって受け止めてあげる
もう我慢しないでいっぱい出してね
Mwah お願い きみが欲しいの
慰めさせてシェイクシェイク
愛の才能で
泣いてくれなきゃ涸れてしまう
濡れていたい
ねえいいでしょう?
舐め取って 飲み干したいんだってば
Mwah お願い きみが欲しいの
頼り散らしてシックラブ
なんて最高ね
分けてくれなきゃ
君の“痛い”感じていたい
ねえいいでしょう?
吸い取って 救いたいんだってば
見たいの きみの中
見たいの
ねえあたし知ってるよ
きみがひとり悔しがってんの
知ってるよ
ズキュンズキュン高まるじゃん
きみを推すことをやめない
ねえあたし知ってるよ
きみはできる子 知ってるよ
つらい時は弱いくらいで丁度いい
あたしそれでも好きだよ
Mwah お願い きみが欲しいの
名前を呼んでよ
いつだって會いに參上
きみはひとりだ
だから歌う「ひとりじゃない」
もういいでしょう
ソロプレイは
お仕舞いなんだってば
きみが病めるときも
あたし側にいるわ
いつも見守っているわ
そうよ 怖くないのよ
Mwah お願い きみが欲しいの
慰めさせてシェイクシェイク
愛の才能で
泣いてくれなきゃ涸れてしまう
濡れていたい
ねえいいでしょう?
舐め取って 飲み干したいんだってば
Mwah お願い きみが欲しいの
頼り散らしてシックラブ
なんて最高ね
分けてくれなきゃ
君の“痛い”感じていたい
覗いていたい
吸い取って 救いたいんだってば
ねえあたし知ってるよ
きみがひとり“涙”してるの
知ってるよ
グスングスン凹んでさ
弱音ヒトカラ in the night
朝が來るまで一緒コース
もっと泣いたって
何度だって受け止めてあげる
もう我慢しないで出してってば
さあ

證明會不了一點,這里直接給結論。
首先會一下矩陣求行列式。
有定義式:
\[\det(A) = \sum_P (-1)^{\mu(P)}\prod_{i = 1} ^ n A_{i, p_i}
\]
其中 \(\mu\) 表示逆元數量。
然后我們知道幾個比較顯然的性質,就可以快速算行列式了。
首先上三角或下三角矩陣的行列式為對角線之積。
然后交換兩行行列式取反、一行加上另一行的倍數行列式不變。
于是就可以直接暴力高消了。
高消的時候有個八百年不用一次的技巧,就是當模數不是質數時可以用類似輾轉相除來消掉一行,復雜度不變。
然后矩陣數定理有一下幾點:
-
無向圖:
我們定義 Kirchhoff 矩陣為 \(\text{度數矩陣} - \text{鄰接矩陣}\),則生成樹個數等于其去掉任意第 \(k\) 行 \(k\) 列后的行列式的值。
其實我們去掉第 \(k\) 行相當于是用 \(k\) 做根,但是無向圖生成樹個數與根無關。
-
有向圖:
這個分外向樹和內向樹。
外向樹就是吧度數矩陣設成入度,內向樹就是出度。
這里不同的根就不一樣了。
-
Best 定理:
歐拉圖的歐拉回路數量是:
不欽定起點:\(t^{root}(G, k) \prod_u (deg_u - 1)!\),\(t^{root}(G, k)\) 表示 \(G\) 以 \(k\) 為根的內向樹生成樹個數,其中 \(k\) 可以任取。
歐拉圖每個點的出入度是一樣的,所以事實上內向樹或外向樹沒區別。
欽定起點要乘上起點 \(k\) 的度數。
帶權就不是很有意思了,當成多條邊即可,求的是生成樹的邊權積。
放個模板題的代碼吧:
Code
/* Local File
in_out/in.in
in_out/out.out
*/
#include <bits/stdc++.h>
using namespace std;
using llt = long long;
using ull = unsigned long long;
using llf = long double;
#define endl '\n'
const int N = 303, MOD = 1e9 + 7;
int n, m, _t, gp[N][N];
int Det(int a[N][N], int l){
int v = 1;
for(int i = 2; i <= l; ++i){
int t = 0;
for(int j = i; j <= l; ++j) if(a[j][i]) t = j;
if(!t) return 0;
if(i != t) swap(a[i], a[t]), v = -v;
for(int j = i + 1; j <= l; ++j) while(a[j][i]){
if(abs(a[j][i]) < abs(a[i][i])) swap(a[j], a[i]), v = -v;
int t = a[j][i] / a[i][i];
for(int k = i; k <= l; ++k) a[j][k] = (a[j][k] - 1ll * a[i][k] * t) % MOD;
}
}
for(int i = 2; i <= l; ++i) v = 1ll * v * a[i][i] % MOD;
return v;
}
int main(){
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
cin >> n >> m >> _t;
if(_t) for(int i = 1 ; i <= m; ++i){
int u, v, w; cin >> u >> v >> w;
gp[u][v] = (gp[u][v] - w) % MOD, gp[v][v] = (gp[v][v] + w) % MOD;
}
else for(int i = 1 ; i <= m; ++i){
int u, v, w; cin >> u >> v >> w;
gp[u][v] = (gp[u][v] - w) % MOD, gp[v][u] = (gp[v][u] - w) % MOD;
gp[u][u] = (gp[u][u] + w) % MOD, gp[v][v] = (gp[v][v] + w) % MOD;
}
cout << (Det(gp, n) + MOD) % MOD;
}
P

本文來自博客園,作者:xrlong,轉載請注明原文鏈接:http://www.rzrgm.cn/xrlong/p/18871961
版權聲明:本作品采用 「署名-非商業性使用-相同方式共享 4.0 國際」許可協議(CC BY-NC-SA 4.0) 進行許可。

浙公網安備 33010602011771號