最小生成樹之kruskal算法(待修改)

最小生成樹之kruskal算法

/*
kruskal 算法適用於簡單圖更好, 而prim更適合稠密圖
*/

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

const int maxn = 200005;
int fat[maxn], n, m, val = 0;

struct node
{
    int from, to, dis;
}edge[maxn];

bool cmp(node a, node b)
{
    return a.dis < b.dis;
}

void init()
{
    for(int i = 1; i <= n; i++)
    {
        fat[i] = i; // 先使自己爲自己的父親
    }
}

int father(int x)  //查找x的父親是誰
{
    if(x != fat[x])
        return father(fat[x]);
    else
        return x;
}

int un(int x, int y) //使x的父親爲y父親的父親
{
    fat[father(y)] = father(x);
}

int kruskal()
{
    init();
    sort(edge+1, edge+1+m, cmp); // kruskal 的部分
    int k = 0;
    for(int i = 1; i<= m; i++)
    {
        if(k == n-1)
            break;
        if(father(edge[i].from) != father(edge[i].to)) // 如果from 和 to 的父親不一樣 即 from和to不在一個集合裏
        {
            un(edge[i].from, edge[i].to);
            val += edge[i].dis;
            k++;
        }
    }
    printf("%d\n", val);
}

int main()
{
    scanf("%d %d", &n, &m);
    for(int i = 1; i <= m; i++)
        scanf("%d %d %d", &edge[i].from, &edge[i].to, &edge[i].dis);
    kruskal();
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章