Slim Span -生成树性质-枚举最小树

  • Slim Span

  •  POJ - 3522 
  • 题意:找一种生成树建树方法使最大最小的差最小 。
  • 枚举枚举最小边即可注意一旦生不成树break即可.
  • #include<stdio.h>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    #define maxn 10002
    #define inf 0x3f3f3f3f
    struct node
    {
        int x,y,z;
    } edge[maxn];
    int fa[maxn],num,ans,minn,n,m;
    int fond(int x)
    {
        return x==fa[x]?x:fa[x]=fond(fa[x]);
    }
    bool cmp(node a,node b)
    {
        return a.z<b.z;
    }
    void init()
    {
        for(int i=1; i<=n; i++)
            fa[i]=i;
    }
    int kruskal(int s)
    {
        init();
        int x,y;
        num=n;
        ans=-1;
        for(int i=s; i<m; i++)
        {
            x=fond(edge[i].x);
            y=fond(edge[i].y);
            if(x==y)
                continue;
            fa[x]=y;
            num--;
            if(num==1)
            {
                ans=edge[i].z;
                break;
            }
        }
        return ans-edge[s].z;
    }
    int main()
    {
        while(~scanf("%d%d",&n,&m))
        {
            if(n==0&&m==0)
                break;
            for(int i=0; i<m; i++)
                scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].z);
            sort(edge,edge+m,cmp);
            minn=kruskal(0);
            if(minn<0)
            {
                printf("-1\n");
                continue;
            }
            for(int i=1; i<m; i++)
            {
                int temp=kruskal(i);
                if(temp<0)
                    break;
                minn=min(minn,temp);
            }
            printf("%d\n",minn);
        }
        return 0;
    }
    
  •  

猜你喜欢

转载自blog.csdn.net/BePosit/article/details/82533565