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#includeusing
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個棉花糖,乙個棉花糖最少要用掉一朵雲,小杉想知道他怎麼連,花費的代價最小。輸入格式 每組測試...