图结构练习——最小生成树

来源:互联网 发布:盒子k歌软件 编辑:程序博客网 时间:2024/06/05 10:43

Think:
1知识点:最小生成树Kruskal算法
2反思:题意分析建议使用最小生成树Prim算法
3知识体系分析:Kruskal算法更适用于稀疏图,未加堆优化的Prim算法更适用于稠密图,堆优化的Prim算法更适用于稀疏图——啊哈!算法

SDUT题目链接

以下为Accepted代码

#include <bits/stdc++.h>using namespace std;struct node {    int u;    int v;    int w;}e[100004];int n, f[104];bool cmp(struct node a, struct node b){    return (a.w < b.w);}void Init();int get_f(int v);bool Merge(int u, int v);int main(){    int m, i, cnt, sum;    while(scanf("%d %d", &n, &m) != EOF){        cnt = sum = 0;        Init();        for(i = 1; i <= m; i++){            scanf("%d %d %d", &e[i].u, &e[i].v, &e[i].w);        }        sort(e+1, e+m+1, cmp);        for(i = 1; i <= m; i++){            if(cnt == n-1)                break;            if(!Merge(e[i].u, e[i].v)){                cnt++;                sum += e[i].w;            }        }        printf("%d\n", sum);    }    return 0;}void Init(){    for(int i = 1; i <= n; i++)        f[i] = i;}int get_f(int v){    if(f[v] == v)        return f[v];    else {        f[v] = get_f(f[v]);        return f[v];    }}bool Merge(int u, int v){    int t1 = get_f(u);    int t2 = get_f(v);    if(t1 == t2)        return true;    else {        f[t2] = t1;        return false;    }}/***************************************************User name: Result: AcceptedTake time: 20msTake Memory: 336KBSubmit time: 2017-07-14 10:15:57****************************************************/
原创粉丝点击