码迷,mamicode.com
首页 > 编程语言 > 详细

学习笔记:克鲁斯卡尔算法

时间:2018-01-06 20:01:53      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:算法实现   克鲁斯   vector   建图   ios   ==   stream   bsp   nbsp   

一、算法描述

1.新建图,该图含有求最小生成树图中所有的顶点,但没有边。

2.将求最小生成树图中所有的边排序。

3.从权值最小的开始遍历每条边,若边中的两个点在新建图中不存在连通路径,则将其加入新建图中。

4.遍历结束新建图即为最小生成树。

 

二、算法实现

1.辅助数组判断两点是否连通。

 

#include <iostream>
#include <algorithm>
#include <vector>

struct edge {
    int u, v, w;
    edge(int u, int v, int w) :u(u), v(v), w(w) {};
    bool operator<(const edge& rhs)const {
        return w < rhs.w;
    }
};

const int maxn = 100;
int set_id[maxn];
int n, m;
std::vector<edge> edges;
std::vector<edge> mst_edges;

void kruskal() {
    std::sort(edges.begin(), edges.end());
    for (int i = 1; i <= n; i++)
        set_id[i] = i;
    for (std::vector<edge>::iterator itr = edges.begin(); itr != edges.end(); itr++) {
        if (set_id[itr->u] == set_id[itr->v])
            continue;
        for (int i = 1; i <= n; i++)
            if (i != itr->u && set_id[i] == set_id[itr->u])
                set_id[i] = set_id[itr->v];
        set_id[itr->u] = set_id[itr->v];
        mst_edges.push_back(*itr);
    }
    int sum = 0;
    for (edge e : mst_edges)
        sum += e.w;
    std::cout << sum << std::endl;
}

int main() {
    int u, v, w;
    std::cin >> n >> m;
    for (int i = 0; i < m; i++) {
        std::cin >> u >> v >> w;
        edges.push_back(edge(u, v, w));
    }
    kruskal();
    return 0;
}

 

学习笔记:克鲁斯卡尔算法

标签:算法实现   克鲁斯   vector   建图   ios   ==   stream   bsp   nbsp   

原文地址:https://www.cnblogs.com/arseneyao/p/8214855.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!