給定乙個樹,你需要在這個樹中新增若干條邊,使得這顆樹變成乙個完全圖,並且滿足圖的唯一最小生成樹仍是這個樹,問你最小新增的邊權為多少?
不妨我們從頭開始構造這個最小生成樹。
假設我們當前加入的邊為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條小道,並且每個水龍頭都可以...