AcWing 346 走廊潑水節

2022-08-13 11:51:21 字數 1272 閱讀 7549

題目思路

將乙個最小生成樹的圖,新增一些邊,使得成為乙個完全圖,並且生成的完全圖的最小生成樹還是原樹

演算法分析

構建最小生成樹的kruskal演算法

首先將所有的邊按照從小到大的順序排序

對於一條邊(x,y,w),如果x和y在不在乙個連通塊中,就說明他們之間沒有邊相連那麼我們相連之後,現在這兩個點,各自所在的連通塊(集合),都擁有了乙個最短邊,也就是(x,y,w)

最小生成樹已經確定了,那麼原來兩個連通塊的其他點怎麼辦?

假設\(s_x\)表示為\(x\)之前所在的連通塊,那麼\(s_y\)表示\(y\)之前所在的連通塊。

由於我們不能破壞最小生成樹,所以我們原來這兩個連通塊必須具有如下性質:假設點a屬於\(s_x\)這個集合,點b屬於\(s_y\)這個集合,那麼a與b之間的距離,必須大於之前的\(w\)否者就會破壞之前的最小生成樹,所以說

\[a與b之間的距離最小為w+1

\]假如\(s_x\)有\(p\)個元素,然後\(s_y\)有\(q\)個元素,那麼將\(s_x\)和\(s_y\)連通塊中所有的點相連,就會增加:

\[p × q - 1條邊

\]每條邊的最小長度為\(w + 1\)

所以就會得出

\[(w + 1) × (p × q)為兩個連通塊成為完全圖的最小代價

\]實現**

#include #include using namespace std;

const int n = 6010;

struct edge

}e[n];

int n;

int t;

int p[n], s[n];

int find(int x)

int main()

sort(e, e + n - 1);

for(int i = 1;i <= n;i++) p[i] = i, s[i] = 1;

int res = 0;

for(int i = 0;i < n - 1;i++)

}cout << res << endl;

}return 0;

}

走廊潑水節

給定一棵n個節點的樹,要求增加若干條邊,把這棵樹擴充為完全圖,並滿足圖的唯一最小生成樹仍然是這棵樹。求增加的邊的權值總和最小是多少。輸入格式 第一行包含整數t,表示共有t組測試資料。對於每組測試資料,第一行包含整數n。接下來n 1行,每行三個整數x,y,z,表示x節點與y節點之間存在一條邊,長度為z...

走廊潑水節(TYVJ1391)

演算法 圖論 最小生成樹 分析 題目大意在tyvj上說的不是很清楚,這裡再說明一下,就是說給出了乙個不完全圖 最小生成樹 在這個不完全圖中新增邊使之成為完全圖,同時新增完邊之後必須能保證不破壞原來的最小生成樹。可以採用kruskal解決,我們知道kruskal的最終目的是將兩棵最小生成樹合成一棵,設...

tyvj 1391 走廊潑水節

p1391 走廊潑水節 背景話說,中中帶領的oier們打算舉行一次冬季潑水節,當然這是要秘密進行的,絕對不可以讓中中知道。不過中中可是 湖了,當然很快就發現了我們的小陰謀,於是他準備好水槍迫不及待的想要加入我們了。描述我們一共有n個oier打算參加這個潑水節,同時很湊巧的是正好有n個水龍頭 至於為什...