走廊潑水節 最小生成樹 思維

2021-09-28 11:42:48 字數 908 閱讀 3568

給定乙個樹,你需要在這個樹中新增若干條邊,使得這顆樹變成乙個完全圖,並且滿足圖的唯一最小生成樹仍是這個樹,問你最小新增的邊權為多少?

不妨我們從頭開始構造這個最小生成樹。

假設我們當前加入的邊為edge(u,v,cost),如果u所在的並查集為s(u),v為s(v),因為我們加的這條邊,很明顯是當前最小的(kruskal的過程),那麼如果我們要把原圖變為乙個完全圖,則兩個集合的任意兩點都要加邊,邊的大小最小是多少呢?就是cost+1,因為如果存在x,y分別來自兩個並查集,他們之間如果建立一條<=cost的邊,最小生成樹就會先鏈結(x,y)再鏈結(u,v),很明顯最小生成樹會發生改變。

所以,我們模仿最小生成樹的過程,每次合併兩個並查集,答案就要加上(z+1)|s(u)s(v)-1|,這樣保證最小生成樹不變且加邊最小。

#include using namespace std;

typedef long long ll;

const int maxn=6000+10;

struct edge

};vectoredges;

int cmp(const edge a,const edge b)

int fa[maxn];

int sz[maxn];

int find_set(int x)

void union(int x,int y)

else

}}signed main()

for(int i=1;isort(edges.begin(),edges.end(),cmp);

ll ans=0;

for(int i=0;i<(signed)edges.size();i++)

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

}return 0;

}

最小生成樹拓展 走廊潑水節

給定一棵n個節點的樹,要求增加若干條邊,把這棵樹擴充為完全圖,並滿足圖的唯一最小生成樹仍然是這棵樹。求增加的邊的權值總和最小是多少。注意 樹中的所有邊權均為整數,且新加的所有邊權也必須為整數。輸入格式 第一行包含整數t,表示共有t組測試資料。對於每組測試資料,第一行包含整數n。接下來n 1行,每行三...

走廊潑水節 最小生成樹定理

給定一棵n個節點的樹,要求增加若干條邊,把這棵樹擴充為完全圖,並滿足圖的唯一最小生成樹仍然是這棵樹。求增加的邊的權值總和最小是多少。注意 樹中的所有邊權均為整數,且新加的所有邊權也必須為整數。第一行包含整數t,表示共有t組測試資料。對於每組測試資料,第一行包含整數n。接下來n 1行,每行三個整數x,...

CH6201 走廊潑水節 最小生成樹

描述 簡化版題意 給定一棵n個節點的樹,要求增加若干條邊,把這棵樹擴充為完全圖,並滿足圖的唯一最小生成樹仍然是這棵樹。求增加的邊的權值總和最小是多少。我們一共有n個oier打算參加這個潑水節,同時很湊巧的是正好有n個水龍頭 至於為什麼,我不解釋 n個水龍頭之間正好有n 1條小道,並且每個水龍頭都可以...