最小生成树--kruskal算法

来源:互联网 发布:西部数码域名续费价格 编辑:程序博客网 时间:2024/06/07 02:19

2016.12.30

算法思想:
先将边按照权值排序,从权值最小的边开始枚举,如果当前边连接的两个点不属于同一集合,就将这两个点连起来(用到的数据结构是并查集)
一直到枚举完所有的边,此时生成的就是最小生成树

#include <iostream>#include <stdio.h>#include <algorithm>#include <string.h>using namespace std;int cnt, ans;int f[505];struct d{    int x, y, v;}e[250005];void init(void);void add(int ,int ,int );bool cmp(d , d);void kruskal(void);int find(int );int main(void){    int i, j, n, z;    cin >> z;    while (z--)    {        init();        kruskal();        cout << ans << endl;    }    return 0;}void kruskal(void){    int i, x, y;    for (i = 1; i <= cnt; ++i)    {        x = find(e[i].x);        y = find(e[i].y);        if (x != y)        {            f[x] = y;            ans = ans < e[i].v ? e[i].v : ans;        }    }}void add(int x, int y,int z){    e[++cnt].x = x;    e[cnt].y = y;    e[cnt].v = z;}int find(int x){    return f[x] == x ? x : f[x] = find(f[x]);}void init(void){    int i, j, n, t;    ans = cnt = 0;    memset(e, 0, sizeof(e));    cin >> n;    for (i = 1; i <= n; ++i)        for (j = 1; j <= n; ++j)        {            cin >> t;            if (i != j)                add(i, j, t);        }    for (i = 1; i <= n; ++i)        f[i] = i;    sort(e+1, e+cnt+1, cmp);}bool cmp(d a, d b){    return a.v < b.v;}
0 0