給定一張 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...