poj-3522-Slim Span-kruskal活用

来源:互联网 发布:理智与情感结局 知乎 编辑:程序博客网 时间:2024/04/28 13:53

本题的题意是让你求一颗生成树,使得最大边-最小边最小。

枚举最小边。kruskal求生成树的最大边。

#include <iostream>#include<algorithm>#include<stdio.h>#include<string.h>#include<stdlib.h>#include<queue>#include<stack>#include<math.h>using namespace std;#define maxm 110*110#define maxn 110#define eps 0.000001#define zero(x) ((fabs(x)<eps?0:x))#define INF 99999999struct list{    int u;    int v;    int w;    friend bool operator < (const list &a,const list &b)    {        return a.w<b.w;    }}edge[maxm];int f[maxn];int find(int x){    while(x!=f[x])x=f[x];    return x;}int main(){    int n,m,i,j,k;    while(~scanf("%d%d",&n,&m)&&(n||m))    {        for(i=1;i<=m;i++)        {            scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);        }        sort(edge+1,edge+m+1);        int minn=INF;        for(k=1;k<=m;k++)        {            for(i=1;i<=n;i++)f[i]=i;            int l=0;            int amin,amax;            amin=INF;            amax=-1;            for(i=k;i<=m;i++)            {                int a=find(edge[i].u);                int b=find(edge[i].v);                if(a==b)continue;                l++;                amin=min(amin,edge[i].w);                amax=max(amax,edge[i].w);                f[a]=b;                if(l==n-1)break;            }            if(l!=n-1)break;            minn=min(minn,amax-amin);        }        if(minn==INF)cout<<"-1"<<endl;        else cout<<minn<<endl;    }    return 0;}


0 0