luoguP1195 口袋的天空

2022-05-05 16:45:07 字數 1302 閱讀 4204

emmmmm

最小生成樹,kruskal

大概是dtx教的,%%%

這道題是學長推薦做的(我點名要水題

/*超喜歡題面嗷

漂亮的天空上有漂亮的雲彩,漂亮的孩子做著漂亮的夢

(而且立刻聯想到小雲彩嗷嗷嗷   qwq*/

無視以上廢話,看題

其實和最小生成樹的模版題沒什麼區別(悄咪咪表示某谷測試點裡沒有輸出orz的點

我們只需要想一下要做出k個棉花糖

就是生成k棵樹

總共n個點

生成1棵樹連邊n - 1條

生成2棵樹連邊n - 2條

生成k棵樹連邊n - k條

在kruskal函式中加乙個計數就好了

然後我在這裡再講一下kruskal吧

(prim沒人給我講,也看不懂【斜眼笑

眾所周知(???我可能看學長部落格多了?用詞突然相似

kruskal和prim是求最小生成樹的兩種演算法

區別嘛。。。應該是,kruskal將邊排序,prim更新節點連最小邊?

都是貪心的思路

從任意點出發,首先選擇最短的邊與之相連,再選擇與這棵樹之間距離最短的邊相連,最後輸出的一定是最優解(這是兩者的總體思路

那麼kruskal是將所有邊排序,從最小的邊開始連線兩個點

可能連的兩條最短邊不在同一處,但連下去,總會將所有點連到一起

但是需要注意如果選的邊連出了環,那一定不是最優解,此時連的邊就應該捨掉

(orz被學長指出其實是因為不符合樹的性質orz【捂臉

這裡我們可以用並查集來判斷是否會連成環

這樣就結束了

emmmm看**吧

#include#include

using

namespace

std;

const

int maxn = 10010

;int n,m,k,flag = 0

;int

fa[maxn];

struct

edgea[maxn];

//用結構體記錄每條邊連線的點和邊權

intget(int

x)//

並查集int

cmp(edge x,edge y)

//排序的定義(根據邊權大小

intkruskal()

}}

return

ans;

}int

main()

luoguP1195 口袋的天空

標籤 雲端 難度 普及 提高 時空限制 1s 128mb 小杉坐在教室裡,透過口袋一樣的窗戶看口袋一樣的天空。有很多雲飄在那裡,看起來很漂亮,小杉想摘下那樣美的幾朵雲,做成棉花糖。給你雲朵的個數n,再給你m個關係,表示哪些雲朵可以連在一起。現在小杉要把所有雲朵連成k個棉花糖,乙個棉花糖最少要用掉一朵...

luogu P1195 口袋的天空

小杉坐在教室裡,透過口袋一樣的窗戶看口袋一樣的天空。有很多雲飄在那裡,看起來很漂亮,小杉想摘下那樣美的幾朵雲,做成棉花糖。給你雲朵的個數n,再給你m個關係,表示哪些雲朵可以連在一起。現在小杉要把所有雲朵連成k個棉花糖,乙個棉花糖最少要用掉一朵雲,小杉想知道他怎麼連,花費的代價最小。輸入格式 每組測試...

P1195 口袋的天空

小杉坐在教室裡,透過口袋一樣的窗戶看口袋一樣的天空。有很多雲飄在那裡,看起來很漂亮,小杉想摘下那樣美的幾朵雲,做成棉花糖。給你雲朵的個數n,再給你m個關係,表示哪些雲朵可以連在一起。現在小杉要把所有雲朵連成k個棉花糖,乙個棉花糖最少要用掉一朵雲,小杉想知道他怎麼連,花費的代價最小。輸入格式 每組測試...