c++最小生成樹之克魯斯卡爾

最小生成樹有兩個算法,一個是prim,一個是kruskarl徙歼。prim算法就相當于以點為主,來找最小生成樹
而kruskarl算法就是著眼于邊了

核心思想

1.將所有邊按從小到大排序
2.枚舉某一條邊鳖枕,若與邊相連的兩個點不在同一個集合魄梯,就合并這兩個點,不然就跳過(此處會用到并查集)宾符,不會并查集的話可以看看我以前寫的并查集
3.(重點)若邊數=點數-1酿秸,則最小樹成功生成。原理:這其實就是數學魏烫,一條邊有兩條端點辣苏,兩條邊因為共用一個端點,所以是三個端點(如下)

.___.___.

這就是三個點時邊的情況

實現

原題
文字稿如下

題目描述

如題哄褒,給出一個無向圖稀蟋,求出最小生成樹,如果該圖不連通呐赡,則輸出orz

輸入輸出格式

輸入格式:
第一行包含兩個整數N糊治、M,表示該圖共有N個結點和M條無向邊罚舱。(N<=5000井辜,M<=200000)

接下來M行每行包含三個整數Xi绎谦、Yi、Zi粥脚,表示有一條長度為Zi的無向邊連接結點Xi窃肠、Yi

輸出格式:
輸出包含一個數,即最小生成樹的各邊的長度之和刷允;如果該圖不連通則輸出orz

輸入輸出樣例

輸入樣例#1: 復制
4 5
1 2 2
1 3 2
1 4 3
2 3 4
3 4 3
輸出樣例#1: 復制
7
說明

時空限制:1000ms,128M

數據規(guī)模:

對于20%的數據:N<=5冤留,M<=20

對于40%的數據:N<=50,M<=2500

對于70%的數據:N<=500树灶,M<=10000

對于100%的數據:N<=5000纤怒,M<=200000

我用了一個結構體來存儲(也可以用鏈式前向星)

const int M=200100;
struct node{
    int x;//出發(fā)節(jié)點
    int y;//到達節(jié)點
    int w;//邊長度
}a[M];

讀入

cin>>n>>e;
    for(int i=1;i<=e;i++)scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w);

排序

sort(a+1,a+e+1,cmp);

就只有這么一行。
sort其實是algorithm頭文件的一個函數天通,用來排序泊窘,后面我會專門有一篇文章來講它 。
cmp是一個函數像寒,用來排序烘豹。

bool cmp(node x,node y){//注意開結構體類型
    if(x.w<y.w)return 1;//如果邊 x的長度小于邊y的長度,函數返回真诺祸,也就是要交換的意思
    if(x.w==y.w)//如果邊的長度相同(只是為了判重)
        if(x.x>y.x)return 1;//返回 起點更大的
    return 0;
}

主程序

for(int i=1;i<=e;i++)
{
        if(getfather(a[i].x)!=getfather(a[i].y))
    {//如果點 x與點y不在同一個集合里
            ans+=a[i].w;//把這條邊 的長度加入總和
            dad[getfather(a[i].x)]=a[i].y;//并 集過程
            p++;//p記錄邊的數量
        }
   }//因為題目數據携悯,我就直接遍歷了所有邊

最后輸出

cout<<ans;//輸出總和

還是很簡單吧?
完整代碼:

#include <bits/stdc++.h>
using namespace std;
const int M=200100;
struct node{
    int x;
    int y;
    int w;
}a[M];
int n,e,dad[M],p=1,ans;

bool cmp(node x,node y){
    if(x.w<y.w)return 1;
    if(x.w==y.w)
        if(x.x>y.x)return 1;
    return 0;
}
int getfather(int x){
    if(x==dad[x])return x;
    dad[x]=getfather(dad[x]);
    return dad[x];
}
    
int main()
{
    cin>>n>>e;
    for(int i=1;i<=e;i++)scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w);
    sort(a+1,a+e+1,cmp);
    for(int i=1;i<=n;i++)dad[i]=i;
    for(int i=1;i<=e;i++){
        if(getfather(a[i].x)!=getfather(a[i].y)){
            ans+=a[i].w;
            dad[getfather(a[i].x)]=a[i].y;
            p++;
        }
    }
    cout<<ans;
    return 0;
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末筷笨,一起剝皮案震驚了整個濱河市憔鬼,隨后出現的幾起案子,更是在濱河造成了極大的恐慌胃夏,老刑警劉巖轴或,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異构订,居然都是意外死亡侮叮,警方通過查閱死者的電腦和手機避矢,發(fā)現死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門悼瘾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人审胸,你說我怎么就攤上這事亥宿。” “怎么了砂沛?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵烫扼,是天一觀的道長。 經常有香客問我碍庵,道長映企,這世上最難降的妖魔是什么悟狱? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮堰氓,結果婚禮上挤渐,老公的妹妹穿的比我還像新娘。我一直安慰自己双絮,他們只是感情好浴麻,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著囤攀,像睡著了一般软免。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上焚挠,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天膏萧,我揣著相機與錄音,去河邊找鬼宣蔚。 笑死向抢,一個胖子當著我的面吹牛,可吹牛的內容都是我干的胚委。 我是一名探鬼主播挟鸠,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼亩冬!你這毒婦竟也來了艘希?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤硅急,失蹤者是張志新(化名)和其女友劉穎覆享,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體营袜,經...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡撒顿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了荚板。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凤壁。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖跪另,靈堂內的尸體忽然破棺而出拧抖,到底是詐尸還是另有隱情,我是刑警寧澤免绿,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布唧席,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏淌哟。R本人自食惡果不足惜迹卢,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望徒仓。 院中可真熱鬧婶希,春花似錦、人聲如沸蓬衡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狰晚。三九已至筒饰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間壁晒,已是汗流浹背瓷们。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留秒咐,地道東北人谬晕。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像携取,于是被迫代替她去往敵國和親攒钳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內容

  • 參見貪心算法——最小生成樹算法 目錄 1 最小生成樹問題 2 貪心選擇性質2.1 貪心選擇框架——選擇安全邊2.2...
    王偵閱讀 3,652評論 0 2
  • 前言 其實讀完斯坦福的這本《互聯(lián)網大規(guī)模數據挖掘》雷滋,讓我感覺到不撑,什么是人工智能?人工智能就是更高層次的數據挖掘晤斩。機...
    我偏笑_NSNirvana閱讀 12,616評論 1 23
  • 這篇文章由 最小生成樹-Prim算法和Kruskal算法 整理而來, 感謝這篇文章的作者 Prime算法 1. 概...
    愛上落入塵世間的你閱讀 4,136評論 0 2
  • 一焕檬、定義 最小生成樹(Minimum Spanning Tree,MST)僅針對加權連通無向圖澳泵。對于一副加權連通無...
    null12閱讀 2,402評論 0 0
  • 最小生成樹是一個連通加權無向圖中一棵權值最小的生成樹实愚。 Prim算法思想:設圖G頂點集合為U,首先任意選擇圖G中的...
    乘瓠散人閱讀 1,322評論 0 0