zoukankan      html  css  js  c++  java
  • POJ 3522 Kruskal

    题意:
    求一颗生成树,使得边权的最大值与最小值之差最小。如果不能生成树,输出-1。

    思路:Kruskal+枚举最短的边。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    struct node
    {
        int from,to,weight;
    }s[10005];
    int first[10050],next[10050],f[1005],n,m,answer;
    bool cmp(const node &a,const node &b)
    {
        return a.weight<b.weight;
    }
    int find(int x)
    {
        return f[x]==x?f[x]:f[x]=find(f[x]);
    }
    int Kruskal(int k)
    {
        int ans=0x3fffffff,cnt=0;
        for(int i=1;i<=n;i++)
            f[i]=i;
        for(int i=k;i<=m;i++)
        {
            int fx=find(s[i].from),fy=find(s[i].to);
            if(fx!=fy)
            {
                f[fx]=fy;
                ans=s[i].weight;
                cnt++;
            }
        }
        if(cnt==n-1)
        return ans-s[k].weight;
        return 0x3fffffff;
    }
    int main()
    {
        while(scanf("%d%d",&n,&m)&&(n||m))
        {
            answer=0x3fffffff;
            for(int i=1;i<=m;i++)
            {
                scanf("%d%d%d",&s[i].from,&s[i].to,&s[i].weight);
            }
            sort(s+1,s+1+m,cmp);
            for(int i=1;i<=m;i++)
            {
                answer=min(Kruskal(i),answer);
            }
            if(answer==0x3fffffff)
            printf("-1
    ");
            else printf("%d
    ",answer);
        }
    }

    很少见的一次AC。
    这里写图片描述

  • 相关阅读:
    项目经验:如何做到不和产品打起来
    leetcode-剑指30-OK
    leetcode-剑指05-OK
    leetcode-剑指58-OK
    leetcode-剑指28-OK
    leetcode-剑指53-I
    leetcode-剑指18-OK
    leetcode-剑指15-OK
    leetcode-剑指27-OK
    leetcode-剑指17-OK
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532491.html
Copyright © 2011-2022 走看看