通常,矩陣樹定理算出的生成樹是邊權乘積的和。
如果計算所有生成樹邊權和的和,比較暴力的方法就是列舉一條邊,然後計算包含這條邊的生成樹個數。
這樣的時間複雜度是\(o(mn^3)\)的,最壞為\(o(n^3)\)。
考慮優化:
對於一條邊權為w的邊,將邊權設為關於x的多項式\(1+wx\)。
這樣,容易證出,最後的一次項係數就是答案。
把多項式代入高斯消元求值即可。
計算時保留兩項即可。
\((a+bx)*(c+dx)=ac+(ad+bc)x\)
\(\frac=\frac-\frac\)
**:
struct sjd
sjd(int a,int b)
sjd(int x) };
sjd operator+(sjd x,sjd y)
sjd operator-(sjd x,sjd y)
sjd operator*(sjd x,sjd y)
sjd niy(sjd x)
int gauss(sjd sz[31][31],int n)
} if(wz==-1)continue;
if(wz!=i)
}sjd z=niy(sz[i][i]);
for(int j=i+1;j}
for(int i=0;ians=ans*sz[i][i];
return ans.b;
}int a[500],b[500],c[500];sjd sz[31][31];
void addb(int a,int b,int c)
//......
邊權差值最小的生成樹 小資料
描述 description 小 s 最近學了最小生成樹,不過聰明的小 s 顯然對簡單的求最小生成樹不感興趣。現在小 s 想知道,對於乙個給定的圖,它的所有生成樹中,最大邊和最小邊的邊權差最小是多少。輸入格式 input format 第一行,兩個用空格隔開的整數 n 和 m,分別表示頂點數和邊數。...
演算法 最小生成樹的關鍵邊和偽關鍵邊
給你乙個 n 個點的帶權無向連通圖,節點編號為 0 到 n 1 同時還有乙個陣列 edges 其中 edges i fromi,toi,weighti 表示在 fromi 和 toi 節點之間有一條帶權無向邊。最小生成樹 mst 是給定圖中邊的乙個子集,它連線了所有節點且沒有環,而且這些邊的權值和最...
演算法 最小生成樹 所有點成樹有最小總權和
乙個無向圖,如果某個子圖中任意兩個定點都互相連通並且是一棵樹,那麼這棵樹就叫做生成樹。如果邊上有權值,那麼使得邊權和最小的生成樹叫做最小生成樹。找乙個起始點加入樹,對所有點尋找到到樹的距離,從中選擇最小的加入樹,再次更新距離,從中尋找最小的,直到所有點都加入樹。對權值進行排序,然後從小到大進行判斷,...