次小生成樹(LCA )

2022-07-09 08:21:11 字數 1627 閱讀 8481

給定一張 n 個點 m 條邊的無向圖,求無向圖的嚴格次小生成樹。

設最小生成樹的邊權之和為sum,嚴格次小生成樹就是指邊權之和大於sum的生成樹中最小的乙個。

輸入格式

第一行包含兩個整數n和m。

接下來m行,每行包含三個整數x,y,z,表示點x和點y之前存在一條邊,邊的權值為z。

輸出格式

包含一行,僅乙個數,表示嚴格次小生成樹的邊權和。(資料保證必定存在嚴格次小生成樹)

資料範圍

n≤105,m≤3∗105

輸入樣例:

5 61 2 1

1 3 2

2 4 3

3 5 4

3 4 3

4 5 6

輸出樣例:

; d1[j][k] = d2[j][k] = -inf;//兩個最值儲存

for(int u = 0 ; u < 4 ; u ++)}}

}}}int lca(int a, int b , int w)

}if(a != b)

distance[cnt ++] = d1[a][0];

distance[cnt ++] = d1[b][0];

}int dist1 = -inf , dist2 = -inf;

for(int i = 0 ; i < cnt ; i ++)

if(w > dist1) return w-dist1;

if(w > dist2) return w -dist2;

return inf;

}int main()

; }

ll sum = kruskal();//返回最小生成樹 權值總和

bulid();//建立最小生成樹

dfs();//初始化得到每段最大值和嚴格次大值

ll res = 1e18;

for(int i = 0 ; i < m ; i ++)

}printf("%lld\n", res);

return 0;

}

lca 次小生成樹

倍增法求lca 求小資料次小生成樹 給定一張 n 個點 m 條邊的無向圖,求無向圖的嚴格次小生成樹。設最小生成樹的邊權之和為sum,嚴格次小生成樹就是指邊權之和大於sum的生成樹中最小的乙個。輸入格式 第一行包含兩個整數n和m。接下來m行,每行包含三個整數x,y,z,表示點x和點y之前存在一條邊,邊...

次小生成樹(lca)

題目描述 原題來自 beijing 2010 組隊賽 給定一張 n個點 m條邊的無向圖,求無向圖的嚴格次小生成樹。設最小生成樹的邊權之和為 sum,嚴格次小生成樹就是指邊權之和大於 sum 的生成樹中最小的乙個。輸入格式 第一行包含兩個整數 n 和 m,表示無向圖的點數與邊數 接下來 m行,每行三個...

次小生成樹 倍增 LCA

給乙個n個點m條邊 n 100000,m 300000 的無向圖,求它的嚴格次小生成樹。資料範圍很大,o n 2 的演算法顯然是不行的。由於最小生成樹是一棵樹,求任意兩點路徑上的最大 次大邊就成為了經典的lca問題。因此,我們得到了下面的演算法 1 把邊按權值從小到大排序,時間複雜度為o mlogm...