UVA 1395 MST

给你一个图,

求一个生成树, 边权Max – Min 要最小,输出最小值, 不能构成生成树的 输出 -1;

思路:

Keuksal 算法, 先排序边, 然后枚举 第一条边, 往后加入边, 直到有 n-1 条边的树, 求出那个值, 把可能的值取MIN;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
const int maxn = 100 + 7;
set<int> NUM;
struct Edges
{
    int u, v;
    int val;
    bool operator < (const Edges a) const { return val < a.val; }
}E[maxn * maxn];

int Pre[maxn];

int cnt,Max,n,m;
void ADD(int u,int v,int val)
{
    E[cnt].u = u, E[cnt].v = v, E[cnt].val = val;
    cnt++;
}

void Init()
{
    for(int i = 0; i < maxn; ++i) Pre[i] = i;
}

int Find(int x)
{
    int r = x;
    while(r != Pre[r]) r = Pre[r];
    return Pre[x] = r;
}

bool Union(int x,int y)
{
    int ax = Find(x), ay = Find(y);
    if(ax == ay) return false;
 //   if(ax == x || ay == y) CC--;
    Pre[ax] = ay;
   // CC += 2;
    return true;
}

bool MST (int x)
{
    int num = 0;
    Max = -1;
    for(int i = 0; i < maxn; ++i) Pre[i] = i;
    for(int i = x; i < m; ++i)
    {
        int a = Find(E[i].v), b = Find(E[i].u);
        if(a == b) continue;
        Pre[a] = b;
        Max = max(Max,E[i].val);
        if(++num == n-1) return true;
    }
    return false;
}
int main()
{
    while(~scanf("%d%d",&n,&m) && (n + m))
    {
        cnt = 0;
        int a, b, c;
        for(int i = 0; i < m; ++i)
        {
            scanf("%d%d%d",&a,&b,&c);
            ADD(a,b,c);
        }
        int ans = 999999999;
        sort(E,E+m);
        for(int i = 0; i < m; ++i)
        {
            if(MST(i))
            {
                ans = min(ans, Max - E[i].val);
            }
        }
        if(ans == 999999999) ans = -1;
        printf("%d\n",ans);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值