poj3552 Slim Span(暴力+kruskal)

来源:互联网 发布:淘宝网上能买汽车吗 编辑:程序博客网 时间:2024/06/07 02:45

这题就是求一个最小生成树,最小生成树的定义为最大边-最小边最小。我们可以直接暴力的枚举最小边,然后做最小生成树。O(m2)

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 110inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();    return x*f;}int n,m,ans=0,fa[N];struct edge{    int x,y,val;}e[N*N];inline bool cmp(edge x,edge y){return x.val<y.val;}inline int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}int main(){//  freopen("a.in","r",stdin);    while(1){        n=read();m=read();if(!n&&!m) break;ans=inf;        for(int i=1;i<=m;++i) e[i].x=read(),e[i].y=read(),e[i].val=read();        sort(e+1,e+m+1,cmp);        for(int s=1;s+n-1-1<=m;++s){            for(int i=1;i<=n;++i) fa[i]=i;int tot=0,t=s;            while(t<=m){                int xx=find(e[t].x),yy=find(e[t].y);                if(xx!=yy) fa[xx]=yy,++tot;                if(tot==n-1) break;++t;            }if(tot!=n-1) break;            ans=min(ans,e[t].val-e[s].val);        }if(ans==inf) puts("-1");        else printf("%d\n",ans);    }return 0;}