Kruskal算法求最小生成树-算法设计与分析实验3

来源:互联网 发布:编程求解汉诺塔问题 编辑:程序博客网 时间:2024/06/04 23:30

题目: 求如图所示,用kruskal算法求下面图的最小生成树:



话不多说,程序如下:

#include<iostream>#include<stdlib.h>#define N 7using namespace std;typedef struct _node{    int val;    int start;    int end;}Node;Node V[N];int cmp(const void *a, const void *b){    return (*(Node *)a).val - (*(Node*)b).val;}int edge[N][3] = {  { 0, 1, 3 },                    { 0, 4, 1 },                     { 1, 2, 5 },                     { 1, 4, 4 },                    { 2, 3, 2 },                     { 2, 4, 6 },                     { 3, 4, 7}                     };int father[N] = { 0, };int cap[N] = {0,};void make_set()              //初始化集合,让所有的点都各成一个集合,每个集合都只包含自己{    for (int i = 0; i < N; i++)    {        father[i] = i;        cap[i] = 1;    }}int find_set(int x)              //判断一个点属于哪个集合,点如果都有着共同的祖先结点,就可以说他们属于一个集合{    if (x != father[x])     {                                      father[x] = find_set(father[x]);    }         return father[x];}                                  void Union(int x, int y)         //将x,y合并到同一个集合{    x = find_set(x);    y = find_set(y);    if (x == y)        return;    if (cap[x] < cap[y])        father[x] = find_set(y);    else    {        if (cap[x] == cap[y])            cap[x]++;        father[y] = find_set(x);    }}int Kruskal(int n){    int sum = 0;    make_set();    for (int i = 0; i < N; i++)//将边的顺序按从小到大取出来    {        if (find_set(V[i].start) != find_set(V[i].end))     //如果改变的两个顶点还不在一个集合中,就并到一个集合里,生成树的长度加上这条边的长度        {            Union(V[i].start, V[i].end);  //合并两个顶点到一个集合            sum += V[i].val;        }    }    return sum;}int main(){    for (int i = 0; i < N; i++)   //初始化边的数据,在实际应用中可根据具体情况转换并且读取数据,这边只是测试用例    {        V[i].start = edge[i][0];        V[i].end = edge[i][1];        V[i].val = edge[i][2];    }    qsort(V, N, sizeof(V[0]), cmp);    cout << Kruskal(0)<<endl;    return 0;}


运行结果如下:

从图中也可以看出,最小权值是: 1+3+5+2 = 11,那么这个实验的第一小题就是这样。

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 十八岁女人 十八岁 长高 十八岁生日送什么 十八岁洗面奶 女生十八岁长高 老婆刚满十八岁 十八岁成人纪念册 小小新娘十八岁 十八岁能长高吗 十八岁包皮过长 十八岁女儿生日礼物 适合十八岁女生用的护肤品 十八岁可以做人流吗 十八岁学生 十八岁的青春 十八岁长高的方法 十八岁礼物送什么好 十八岁的乳房 十八岁女儿 十八岁成人礼歌曲 十八岁处女 十八岁干什么 十八岁禁忌 回到十八岁 十八岁成人礼送什么 朋友十八岁生日送什么礼物 送女朋友十八岁礼物 十八岁未成年 十八岁需要护肤吗 女朋友十八岁生日送什么礼物 十八岁成人礼诗歌 我的妻子十八岁 十八岁男孩心理 十八岁的生日 十八岁了怎样长高 十八岁女性阴道 男朋友十八岁送什么 大岗十八罗汉山 云南十八怪顺口溜大全 云南十八怪原版顺口溜 十八怪