POJ3522-Slim Span

来源:互联网 发布:辛集淘宝运营培训学校 编辑:程序博客网 时间:2024/05/22 06:09

求生成树里 |最大权-最小权|==差值,求差值最小的。

反复思索应该用什么算法,但最后答案就是kruskal的枚举。(之前在大连也遇到过这种题,就是需要让你把一个算法枚举)数据量比较小,所以不会超时。

排序后权值是从小到大的,你一个个的往后作为最小的权值,不需要在意那些被忽略的 ,这里我绕了好久才明白。

#include<stdio.h>#include<vector>#include<set>#include<string.h>#include<string>#include<map>#include<algorithm>using namespace std;int pre[110],n,m,ans;struct e{    int x,y,z;}a[100000];int cmp(e a,e b){return a.z<b.z;}void init(){    for(int i=0;i<=n;i++)        pre[i]=i;}int find(int x){    while(x!=pre[x])        x=pre[x];    return x;}int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {        if(n==0&&m==0) break;        for(int i=0;i<m;i++){            scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);        }        ans=999999;        sort(a,a+m,cmp);        for(int i=0;i<m;i++){            init();            int cnt=0,temp=999999;            for(int j=i;j<m;j++){             int fx=find(a[j].x);             int fy=find(a[j].y);             if(fx!=fy){                pre[fy]=fx;                cnt++;                if(cnt==n-1){                    temp=a[j].z-a[i].z;                    break;                }             }            }            if(temp<ans)                ans=temp;        }        if(ans!=999999) printf("%d\n",ans);        else printf("-1\n");    }    return 0;}


0 0