1. 程式人生 > >Slim Span -生成樹性質-列舉最小樹

Slim Span -生成樹性質-列舉最小樹

#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;
}