201812 4 資料中心(kruskal)

2022-07-24 19:09:12 字數 2237 閱讀 3452

考場上的時候被題目完全蒙住了,當時狀態也不好,前幾次考試每次考試當天就頭暈感冒流鼻涕

好的,以上都是藉口,自己沒有好好複習才是真的...

題目:

好的,以上題目簡述就是:給你乙個無向連通圖,求它的最小生成樹的最大邊,姐妹們,如果你們考場看懂了題目帶了資料結構書或者會krukal又怎麼不會得分呢?

我就是沒看懂題目得人啊!不過,通過我今天的驗證,發現就算我看懂了題目我也不一定得分,因為我執行錯誤orz...

就是簡單的使用了一下kruskal,整個演算法清晰易懂

1 #include2 #include3 #include4 #include5

using

namespace

std;6//

第一次提交:執行錯誤,檢視**,沒啥問題啊???7//

第二次提交:修改max_vex = 10^5, 改為5 * 1e5 + 10 ,記住乘方的表示方法 8//

...9

//第八次提交,100分,修改seek函式,由原來的while迴圈變為條件遞迴呼叫!!!然後在找到輸出key的地方由原來條件判斷來查詢i,變成了最後直接計算查詢i

10//

姐妹們,要記住當整個測試資料很大的時候,即使你的計算即使if,但是放到while裡面,該大的資料還是大,我們盡量一點點摳時間總能給你節約出來

11const

int max_vex = 5*1e5 + 10;12

intset

[max_vex];

13 typedef struct

edgededges;

16 edges edgeset[2 *max_vex];

1718

bool

cmp(edges a,edges b)

2122

int seeks(int

v)25

26int kruskal(int n, int

m)31

int u = 0;//

u記錄連線的邊的數量,當u = n-1時,已經構造處一棵樹

32int

key;

33 i = 0;34

while(u < n-1

)41 i++;42}

43 i = i-1

;44 key =edgeset[i].w;

45return

key;46}

4748

intmain()

54 sort(edgeset+1,edgeset+m+1,cmp);//

對邊集陣列按權值公升序排序,其中n為元素個數,即圖的邊數

55int t =kruskal(n, m);

56 cout <

57return0;

58 }

view code

為什麼說是求最小生成樹的最大邊呢?

1:先求每一層的最大邊

2:將所有層最大邊比較求最大邊

也就是求整棵樹的最大邊

那要節約時間當然是所用的邊的權值越小越好

假設最小生成樹的最大邊a不是題目所得最求生成樹最大邊b,即a > b,那麼就是存在比最小生成樹使用更小邊得到的生成樹,obviously,與最小生成樹的定義矛盾了,所以a <= b

therefore 我們需要求無向連通圖的最小生成樹

普遍使用的演算法是prim和kruskal,但是prim使用了鄰接矩陣來表示圖的關係,適用於邊數多頂點少的情況,但是這道題的頂點最大值上了10的5次方,很容易使用陣列越界,為了保險起見,我使用了kruskal,結構體占佔空間就好了

說一下我在提交答案時出現的錯誤,給大家乙個小小的經驗或者說是給我自己提個醒

乘方的表示:切記啊切記,不能直接表示10^4,而是使用1e4,最好大家開空間的時候往額定值大了開,這樣總比一不小心開小了好,由於這個錯誤,我報出了執行錯誤

執行超時:這時候已經得到70分了,但是超時了,所以我就去看看大佬們的**,一點一點去摳自己的時間,while迴圈裡的判斷拿出來,while變成遞迴呼叫,嗯,還是挺有用的

渣渣之開心~

201812 4 資料中心

題目要求求圖形成的樹的邊的最大值的最小值 好繞 總之是乙個貪心,可以通過貪心推導 不過推導完可以發現實際上就是在求最小生成樹 下面分別用不同的方法實現 kruskal演算法,用到了並查集 如下 include include include include define n 500001 using...

CCF 201812 4 資料中心

樣例輸入45 11 2 3 1 3 4 1 4 5 2 3 8 3 4 2 樣例輸出4 樣例說明 下圖是樣例說明。分析 第一眼看到題目,想著是超級複雜的圖論問題,看懂樣例後,就感慨為啥當初我考的時候遇不到這麼簡單的題目呢?把之前14年考過的乙個最優灌溉 複製一下,改幾行 幾分鐘就ac了。言歸正傳,題...

CCF CSP 201812 4 資料中心

題目的意思說白了就是找到乙個最小值k,使得用小於等於k的邊組成的圖是聯通的即可。二分這個k判定下就好了。第二種做法就是求mst裡面的最大邊就是答案。includeusing namespace std define pii pair define mp make pair const int max...