p1391 走廊潑水節
背景話說,中中帶領的oier們打算舉行一次冬季潑水節,當然這是要秘密進行的,絕對不可以讓中中知道。不過中中可是**湖了,當然很快就發現了我們的小陰謀,於是他準備好水槍迫不及待的想要加入我們了。
描述我們一共有n個oier打算參加這個潑水節,同時很湊巧的是正好有n個水龍頭(至於為什麼,我不解釋)。n個水龍頭之間正好有n-1條小道,並且每個水龍頭都可以經過小道到達其他水龍頭(這是一棵樹,你應該懂的..)。但是oier門為了迎接中中的挑戰,決定修建一些個道路(至於怎麼修,秘密~),使得每個水龍頭到每個水龍頭之間都有一條直接的道路連線(也就是構成乙個完全圖唄~)。但是oier門很懶得,並且記性也不好,他們只會去走那n-1條小道,並且希望所有水龍頭之間修建的道路,都要大於兩個水龍頭之前連線的所有小道(小道當然要是最短的了)。所以神cow們,幫那些oier們計算一下吧,修建的那些道路總長度最短是多少,畢竟修建道路是要破費的~~
輸入格式
本題為多組資料~
第一行t,表示有t組測試資料
對於每組資料
第一行n,表示水龍頭的個數(當然也是oier的個數);
2到n行,每行三個整數x,y,z;表示水龍頭x和水龍頭y有一條長度為z的小道
輸出格式
對於每組資料,輸出乙個整數,表示修建的所有道路總長度的最短值。
測試樣例1
輸入2
3 1 2 2
1 3 3
4 1 2 3
2 3 4
3 4 5
輸出4
17 備註
第一組資料,在2和3之間修建一條長度為4的道路,是這棵樹變成乙個完全圖,且原來的樹依然是這個圖的唯一最小生成樹.
資料範圍
每個測試點最多10組測試資料
50% n<=1500;
100% n<=6000
100% z<=100
【分析】
對邊進行權值排序,將邊的左右節點合併到乙個並查集中,合併兩個並查集,並累加一下並查集的size。
在有一條通路的兩個最小生成樹中,將任意兩點直接連通需要
左子樹.size * 右子樹.size -1 條邊,由於對邊權進行了排序,那麼對於第i條邊將左右樹合併的每一條邊的權值=該邊權值+1。
【**】
//tyvj 1391 走廊潑水節
#include
#include
#include
#include
#include
#define fo(i,j,k) for(i=j;i<=k;i++)
using
namespace
std;
struct bian
a[6001];
bool comp(const bian &u,const bian &v)
int main()
fo(i,1,n-1)
sort(a+1,a+n,comp);
fo(i,1,n-1)
cout
0;}
走廊潑水節(TYVJ1391)
演算法 圖論 最小生成樹 分析 題目大意在tyvj上說的不是很清楚,這裡再說明一下,就是說給出了乙個不完全圖 最小生成樹 在這個不完全圖中新增邊使之成為完全圖,同時新增完邊之後必須能保證不破壞原來的最小生成樹。可以採用kruskal解決,我們知道kruskal的最終目的是將兩棵最小生成樹合成一棵,設...
tyvj1391走廊潑水節 kruskal
題目 大意就是把乙個樹擴充成乙個完全圖,並且圖中最小生成樹仍是原來的樹。思路很巧妙,把邊按權值從小到大排序,然後模擬加邊的過程,並查集記錄左右兩邊連通塊的大小 這樣每新加一條邊合併兩個並查集 完全圖 可知此時兩邊的圖中每個點互相連邊的最優選擇就是連線這兩個圖的那條邊的邊權 1 這樣求最小生成樹時要連...
TYVJ 1391 走廊潑水節 生成樹
鏈結太長放不下 給定一棵n nn個節點的樹,要求增加若干條邊,把這棵樹擴充為完全圖,並完全圖的唯一最小生成樹仍然是這棵樹。求增加的邊的權值總和最小是多少。資料範圍 n 6000 n leq6000 n 6000 原有的邊權均為非負整數 首先題目要求完全圖的唯一最小生成樹仍然是這棵樹,所以對於對兩個點...