首页 > 代码库 > poj 3522 Slim Span 最大边减最小边最小的生成树

poj 3522 Slim Span 最大边减最小边最小的生成树

枚举最小边进行kruskal。

#include <cstdio>#include <algorithm>using namespace std;#define maxn 120#define maxm 10000struct edge{    int u,v,w;}e[maxm];int p[maxn],n,m;int find(int x){    if(x==p[x]) return x;    return p[x]=find(p[x]);}void link(int a,int b){    int fa=find(a);    int fb=find(b);    if(fa!=fb)        p[fa]=fb;}int cmp(const void *a,const void *b){    edge aa=*(const edge*)a;    edge bb=*(const edge*)b;    return aa.w-bb.w;}int main(){    while(1)    {        scanf("%d%d",&n,&m);        if(n+m==0) break;        int i,j;        int u,v,w;        int l,r;        for(i=0;i<m;i++)            scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);        qsort(e,m,sizeof(e[0]),cmp);        int minn=10000000;        for(l=0;l<m;l++)        {            int num=0;            for(i=1;i<=n;i++) p[i]=i;            for(i=l;i<m;i++)            {                u=e[i].u;                v=e[i].v;                w=e[i].w;                if(find(u)!=find(v))                {                    link(u,v);                    r=w;                    num++;                }            }            if(num==(n-1)&&(r-e[l].w)<minn)                minn=r-e[l].w;        }        if(minn==10000000) printf("-1\n");        else printf("%d\n",minn);    }    return 0;}