镖局运镖——最小生成树(Kruskal算法)

编程入门 行业动态 更新时间:2024-10-26 00:31:53

<a href=https://www.elefans.com/category/jswz/34/1693815.html style=镖局运镖——最小生成树(Kruskal算法)"/>

镖局运镖——最小生成树(Kruskal算法)

think:
1图的最小生成树(Kruskal算法)——(并查集++)

#include <stdio.h>
#include <stdlib.h>
int f[14];
struct node
{int u;int v;int w;
}ans[14];
void Init(int *a, int n)
{for(int i = 1; i <= n; i++){a[i] = i;}
}
int get_f(int x)
{if(f[x] == x)return x;else{f[x] = get_f(f[x]);return f[x];}
}
int merge(int a, int b)
{int t1 = get_f(a);int t2 = get_f(b);if(t1 != t2){f[t2] = t1;return 1;}elsereturn 0;
}
int cmp(const void *a, const void *b)
{struct node *c = (struct node *)a;struct node *d = (struct node *)b;if(c->w != d->w)return (c->w - d->w);
}
int main()
{int n, m, i, cnt, sum;while(scanf("%d %d", &n, &m) != EOF){cnt = sum = 0;Init(f, n);for(i = 0; i < m; i++){scanf("%d %d %d", &ans[i].u, &ans[i].v, &ans[i].w);}qsort(&ans[0], m, sizeof(ans[0]), cmp);for(i = 0; i < m; i++)//枚举每一条边{if(merge(ans[i].u, ans[i].v))//如果目前尚不连通,则选用这条边{cnt++;sum += ans[i].w;}if(cnt == n-1)//直到选用了n-1条边之后退出break;}printf("%d\n", sum);}return 0;
}

更多推荐

镖局运镖——最小生成树(Kruskal算法)

本文发布于:2024-02-17 11:13:10,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1693800.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:镖局   算法   最小   Kruskal

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!