zoukankan      html  css  js  c++  java
  • poj 2377 拉最长的线问题 kruskal算法

    题意:建光纤的时候,拉一条最长的线

    思路:最大生成树 

    1. 将图的n个顶点看成n个孤立的连通分支,并将所有的边按权从大到小排
    2. 边权递减的顺序,如果加入边的两个端点不在同一个根节点的话加入,并且要将其连通,否则放弃
    3. 最后剩下一个连通支

    解决问题的代码:

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<vector>
    #include<queue>
    #include<map>
    #include<set>
    #include<ctime>
    using namespace std;
    typedef long long ll;
    #define maxn 1111
    #define maxm 22222
    struct node
    {
        int u,v,w;
    }edge[maxm];
    int T,n,m,fa[maxn];
    int cmp(node a,node b)
    {
        return a.w>b.w;
    }
    int find(int x)
    {
        if(fa[x]==x) return x;
        return fa[x]=find(fa[x]);
    }
    int kruskal(int n,int m)
    {
        for(int i=1;i<=n;i++)fa[i]=i;
        int ans=0,cnt=0;
        sort(edge,edge+m,cmp);
        for(int k=0;k<m;k++)
        {
            int x=find(edge[k].u),y=find(edge[k].v);
            if(x!=y)
            {
                cnt++;
                fa[x]=y;
                ans+=edge[k].w;
                if(cnt==n-1)return ans;
            }
        }
        return -1;
    }
    int main()
    {
        while(~scanf("%d%d",&n,&m))
        {
            for(int i=0;i<m;i++)scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
            printf("%d
    ",kruskal(n,m));
        }
        return 0;
    }
    君子知命不惧,自当日日自新
  • 相关阅读:
    小程序配置安装
    微信小程序--录制音频,播放音频
    微信小程序报错.wxss无法找到
    linux 安装 elasticsearch
    Ubuntu 安装Logstash
    python 开发微信 自定义菜单
    微信 python搭建服务器
    vue 本地存储数据 sessionStorage
    luogu1742 最小圆覆盖
    luogu1501 [国家集训队]Tree II
  • 原文地址:https://www.cnblogs.com/xuxiaojin/p/9407962.html
Copyright © 2011-2022 走看看