牛客練習賽69 C旅行(最大生成樹)

2021-10-09 11:47:49 字數 722 閱讀 4289

最小生成樹表示的是 n 個點的路徑代價之和最小,該題求 n 個點路徑代價之和的最大值,也就是求最大生成樹。

證明:**

可以發現,對答案有貢獻的邊肯定是最大生成樹上的邊,那麼可以將這些邊先拉出來,每條邊至少會被貢獻一次

對於當前的乙個聯通塊,找到最小的一條邊,那麼這個聯通塊肯定被分成了兩個聯通塊

考慮怎麼樣才能使答案最優,顯然先將乙個聯通塊內選完以後在經過當前邊到另乙個聯通塊最優(因為兩邊的邊比當前邊要大),可以看出這條邊只對答案貢獻了一次

這樣分治下去就可以得到:將所有生成樹上的邊的權值加起來就是答案

#include using namespace std;

typedef long long ll;

const int n = 5e5 + 10;

const int inf = 0x3f3f3f3f;

struct node

}edge[n];

int father[n];

int n,m;

void init()

int find(int x)

void union(int x,int y)

}ll kruskal()

}return ans;

}int main()

printf("%lld\n", kruskal());

return 0;

}

牛客練習賽69C 旅行 結論,最大生成樹

dis x,ydis disx,y 表示x,y x,yx,y的所有路徑的最短的邊的最大值。求乙個1 n 1 sim n 1 n的排列,使得 i 2ndi si,i 1 sum ndis i 2n disi i 1 最大首先一定是走在最大生成樹上的路徑 考慮兩個已經確定路徑的集合,現在合併這兩個集合,...

牛客練習賽 69

第一次打牛客直接。y1s1牛客的評測系統真的慢,搞得我不想交 題目鏈結 首先先對陣列a逆序貪心可得val i,j a1 a2 ai j val i,j a 1 a 2 dots a val i,j a 1 a 2 ai j 嘗試證明 分析可知我們最終會選擇i j i ji j個陣列a的數,貪心肯定每...

牛客練習賽69 B

題意 給定n nn個數,乙個x xx表示可以劃分成最多x xx個串,乙個y yy表示在乙個串中最多選擇y yy個數。最後求 i 1x j 1yv al i j sum x sum yval i,j i 1x j 1 y va l i,j v al i,j val i,j val i,j 為 將n n...