zoukankan      html  css  js  c++  java
  • 最小生成树

    关于最小生成树,实际上就俩算法,kruskal 和 prim 要说的话《信息学奥赛一本通c++提高篇》 上面都有讲

    事实上我也就只会 kruskal

    关于这两个算法,kruskal是加边,prim是加点,实际只要会一种算法大部分问题就A了

    Kruskal

    在边排序好后不断加边就好了,比较容易理解,因为最大生成树就要求树上最小的边最大

    这时就可以用结构体存边

    struct node{
        int u; int v; int w;
    }a[100005];
    bool cmp(node x,node y){return x.w <y.w ;}//最小生成树

    要判断两点是否已经联通,用并查集

    int fa[305],n,m,ans=0,tot=1;
    int find(int x)
    {
        if(fa[x]==x) return x;
        else return fa[x]=find(fa[x]);
    }

    然后就是kruskal

    void kruskal()
    {
        for(int i=1;i<=n;i++)
        fa[i]=i;//并查集初始化
        sort(a+1,a+m+1,cmp);//边初始化
        for(int i=1;i<=m;i++)
        {
            if(find(a[i].u )==find(a[i].v )) continue;//两点已联通,过
            fa[find(a[i].u )]=find(a[i].v );//联通两点
            ans=max(ans,a[i].w );//这里要看题目要求,这里要求输出最长边
            tot++;//边数加
            if(tot==n) break;//一棵树的边==节点数-1,由于tot开始赋1,so...
        } 
        return ;
    }
  • 相关阅读:
    platform cannot apply stanford theme
    汉化、用户创建
    修改字段
    语言包格式错误引起组件崩溃
    配置LMS/Studio SMTP
    Javascript如何实现AOP
    【转】组件化的Web王国
    【转】前端组件化框架之路
    【转】ES6 手册
    【转】超实用的JavaScript技巧及最佳实践
  • 原文地址:https://www.cnblogs.com/wdxxz3274/p/11997738.html
Copyright © 2011-2022 走看看