最小生成樹kruskal

2021-10-09 05:23:35 字數 731 閱讀 2404

約翰有n個牧場,編號依次為1到n。每個牧場裡住著一頭奶牛。連線這些牧場的有p條道路,每條道路都是雙向的。第j條道路連線的是牧場sj和ej,通行需要lj的時間。兩牧場之間最多只有一條道路。約翰打算在保持各牧場連通的情況下去掉盡量多的道路。

約翰知道,在道路被強拆後,奶牛會非常傷心,所以他計畫拆除道路之後就去忽悠她們。約翰可以選擇從任意乙個牧場出發開始他維穩工作。當他走訪完所有的奶牛之後,還要回到他的出發地。每次路過牧場i的時候,他必須花ci的時間和奶牛交談,即使之前已經做過工作了,也要留下來再談一次。注意約翰在出發和回去的時候,都要和出發地的奶牛談一次話。請你計算一下,約翰要拆除哪些道路,才能讓忽悠奶牛的時間變得最少?

我們讀題可以注意到

我們可以得出這是一道最小生成樹的裸題

但是這個題有一些不同,就是我們的邊權是等於起點的權加上終點的權加上邊權*2,為什麼呢,可以舉乙個最簡單的例子,假設從a到b還要回到a,顯然我們可以得到以上的結論。

#includeusing namespace std;

struct repedge[100005];

int n,m,ans=0x3f3f3f3f;

int c[100005];

int fa[100005];

bool cmp(rep a,rep b)

sort(edge+1,edge+1+m,cmp);

for(int i=1;i<=m;i++)

cout<}

kruskal 最小生成樹

include include 產生隨機數組用 include 同上 include using namespace std 1 帶權邊的類myarc class myarc bool operator const myarc arc myarc myarc int beginvex,int end...

最小生成樹Kruskal

最小生成樹有兩個特點,乙個是保證了所有邊的和是最小值,另乙個是保證了所有邊中的最大值最小。struct edge bool friend operator edge a,edge b 構邊 vectoredge int id max int mini void initial void input ...

最小生成樹(kruskal)

kruskal演算法 1 記graph中有v個頂點,e個邊 2 新建圖graphnew,graphnew中擁有原圖中相同的e個頂點,但沒有邊 3 將原圖graph中所有e個邊按權值從小到大排序 4 迴圈 從權值最小的邊開始遍歷每條邊 直至圖graph中所有的節點都在同乙個連通分量中 if 這條邊連線...