• poj 3522 Slim Span


    题意:给N个点,M条边,每个边有相应的权值,然后求出用M条边中的N-1条边形成的树中,边权值最大与最小的差为所有树中最小。

    思路:想到了并查集,然后借用克鲁斯卡尔的思想,边排序,再枚举一下即可。

    卡了很久,最后才发现是因为初始化并查集的时候N是从0~N-1了,还有就是初始化cMin时,却忘了初始化temp……

    用我可怜的小马甲交了N次………

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #define MAXN 105
    #define INF 1000000004
    using namespace std;
    int father[MAXN];
    int rank[MAXN];
    int m, n;
    struct Edge
    {
    int x, y, w;
    }e[5000];

    void makeset()   //并查集初始化

    {
    for(int i=1; i<=n; i++)
    {
    father[i]=i;
    rank[i]=0;
    }
    }

    int findsetr(int x)  //非递归找根节点
    {
    int r=x;
    while(r!=father[r])
    r=father[r];

    int temp;
    while(x!=r)
    {
    temp=father[x];
    father[temp]=r;
    x=temp;
    }
    return r;
    }

    void unionr(int x, int y)  //联合
    {
    x=findsetr(x);
    y=findsetr(y);
    if(x==y)
    return ;
    if(rank[x]>rank[y])
    father[y]=x;
    else
    father[x]=y;
    if(rank[x]==rank[y])
    rank[y]++;
    }

    int cmp(Edge a, Edge b)
    {
    return a.w<b.w;
    }

    int main()
    {
    while(scanf("%d%d", &n, &m))
    {
    if(!n && !m) break;
    for(int i=0; i<m; i++)
    {
    scanf("%d%d%d", &e[i].x, &e[i].y, &e[i].w);

    }
    if(n==2 && m==1) {printf("0\n");continue;} //特判

    if(m<n-1) {printf("-1\n"); continue;}    //M<N-1必然无法形成树
    sort(e, e+m, cmp);  
    int cMin=INF,temp=INF;           //记得temp也要INF,或者把比较cMin>temp?cMin=temp:cMin;放在for(int j……)里
    for(int i=0; i<m-n+2; i++)          //只用0~m-n+2
    {
    makeset();            //初始化
    int k=0;
    for(int j=i; j<m; j++)            //j=i是最小的边权,当k=n-1时,j表示最大的边权
    {
    int x=findsetr(e[j].x);      
    int y=findsetr(e[j].y);
    if(x!=y)            //不是环
    {
    k++;
    unionr(x, y);
    }
    if(k==n-1) {temp=e[j].w-e[i].w; break;}//e[i].w表示第一条被选中的边,e[j].w表示最后一条被选中的边
    }
    cMin>temp?cMin=temp:cMin;
    }
    if(cMin==INF) printf("-1\n");
    else printf("%d\n", cMin);
    }
    return 0;
    }
    作者:FreeAquar
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    SQL 三种Join关联示例
    EntityFramework 更新 整个记录全部字段不确定字段
    C# 生成Excel 报错COMException(0x800A03EC)
    EntityFramework4 几种报错解决方法
    Machine learning lecture2 note
    谷歌360度街景拍摄车对日本核电站污染隔离区进行拍摄
    android电池电量状态代码
    唠骚 2013年终奖
    互联网手机的围城:小米顶多再风光一年(转载)
    AIX下c3p0连接池问题
  • 原文地址:https://www.cnblogs.com/FreeAquar/p/2093919.html
Copyright © 2020-2023  润新知