ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Slim Span (最小生成树)

2019-07-22 21:52:34  阅读:148  来源: 互联网

标签:Span int Slim 最小 fx pair include define


题意

求生成树的最长边与最短边的差值的最小值

题解

最小生成树保证每一条边最小,就只要枚举最小边开始,跑最小生成树,最后一个值便是最大值

在枚举最小边同时维护差值最小,不断更新最小值。

C++代码

/**
/*@author Victor
/*language C++
*/
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUG
#define RI register int
using namespace std;
typedef long long ll;
//typedef __int128 lll;
const int N=100000+10;
const int MOD=1e9+7;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pil pair<int , ll>
#define pli pair<ll,int>
#define pdl pair<double,ll>
#define pld pair<ll,double>
#define pdd pair<double,double>
#define iput(n) scanf("%d",&n);
#define dput(n) scanf("%lf",&n);
#define llput(n) scanf("%lld",&n);
#define cput(n) scanf("%s",n);
#define puti(n) printf("%d\n",n);
#define putll(n) printf("%lld\n",n);
#define putd(n) printf("%lfd\n",n);
#define _cls(n) memset(n,0,sizeof(n));
//求二进制中1的个数
//__builtin_popcount(n);
//求2^k
//#define (ll)Pow(2,k) (1LL<<k)

struct edge
{
    int u,v,cost;
}eg[100001];
int n,m;//,father[100001];

bool cmp(edge e1,edge e2)
{
    return e1.cost<e2.cost;
}

int par[N];        //父亲
int Rank[N];    //树的高度

//初始化n个元素
void init(int n)
{
    for(int i=0; i<=n; ++i)
    {
        par[i] = i;
        Rank[i] = 0;
    }
}
//查询树的根非递归实现
int find(int x)
{
    while(par[x]!=x)
        x=par[x];
    return x;
}
//合并x和y所属集合
void unite(int x,int y)
{
    int fx=find(x);
    int fy=find(y);
    if(fx==fy)
        return;
    if(Rank[fx]>Rank[fy])
        par[fx]=fy;
    else
    {
        par[fy]=fx;
        if(Rank[fx]==Rank[fy])
            Rank[x]++;
    }
}
//关于路径压缩
int find2(int x)
{
    int fx=find(x);
    int t;
    while(x!=fx)
    {
        t=par[x];
        par[x]=fx;
        x=t;
    }
    return fx;
}

// 最小生成树 Kruskal 算法
int minn;
int Kruskal()
{
    minn = 1e9;
    edge e;
    int i,res;
    sort(eg,eg+m,cmp);
    // 构建最小生成树
    for(int j = 0;j < m; j ++){ 
        
        init(n);res=0;
        
        for( i=j;i<m;++i )
        {
            e=eg[i];
            if( find(e.u)!=find(e.v) )
            {
                unite(e.u,e.v);
                
                if(++res == n - 1)
                    minn = min(minn,e.cost - eg[j].cost);
            }
        }
    }
    return res;
}


int main(){
    
    while(scanf("%d%d",&n,&m)&&n+m){
        
        for(int i = 0; i < m;++i){
            scanf("%d%d%d",&eg[i].u,&eg[i].v,&eg[i].cost);
        }
        int ans = Kruskal();
        bool flag = 1;
        
        if(minn != 1000000000) printf("%d\n",minn);
        else printf("-1\n");
    }
}

 

标签:Span,int,Slim,最小,fx,pair,include,define
来源: https://www.cnblogs.com/DWVictor/p/11228659.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有