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

    定义:

    生成树:

      对于一个子图,含有图中所有顶点,但只有足以构成树的n-1条边,这样的子图称为图的生成树;

    最小生成树:

      权值和最小的生成树叫做图的最小生成树。

    这里记录一下Kruskal算法的模板

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <string>
    #include <stack>
    #include <queue>
    #include <cmath>
    #define ll long long
    #define pi 3.1415927
    #define inf 0x3f3f3f3f
    using namespace std;
    struct node {
        int s,ends,cost;
        ///s和ends记录边的端点;cost记录权值
    }a[1005];
    bool cmp (node x, node y)
    {
        return x.cost<y.cost;
    }
    node p;
    int fat[1005];
    ///利用并查集
    int finds(int n)
    {
        if(n==fat[n])
            return n;
        return fat[n]=finds(fat[n]);
    }
    void join (int x, int y)
    {
        int j=finds(x);
        int k=finds(y);
        if(j!=k)
            fat[j]=k;
    }
    
    int kruskal (int n,int m)
    {
        sort(a,a+m,cmp); ///按照权值从小到大排序
        int i,sum=0;
        for(i=0;i<m;++i)
        {
            if(finds(a[i].s)!=finds(a[i].ends))
            {   /// 相等代表已经记录过了,再次join会形成环
                join(a[i].s,a[i].ends);
                sum+=a[i].cost;
            }
        }
        return sum;
    }
    int main ()
    {
        int n,m,i,t,j,k,x,y,p;
        cin>>n>>m;
        for(i=0;i<=n;++i)
            fat[i]=i;
        for(i=0;i<m;++i)
        {
            cin>>x>>y>>p;
            a[i].s=x; a[i].ends=y; a[i].cost=p;
        }
        k=kruskal(n,m);
        cout<<k;
    
        return 0;
    }
  • 相关阅读:
    淡入淡出js
    Comparable和Comparator的区别
    mybatis的动态sql详解
    mybatis动态sql之foreach
    mybatis的动态sql中collection与assoction
    Mybatis中#与$区别
    转JSONObject put,accumulate,element的区别
    Spring配置,JDBC数据源及事务
    销毁session
    IIS express 7.5 设置默认文档
  • 原文地址:https://www.cnblogs.com/blowhail/p/11250526.html
Copyright © 2011-2022 走看看