• Hdu 1233 还是畅通工程


    还是畅通工程

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 46167    Accepted Submission(s): 20997

    Problem Description

    某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。

    Input

    测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
    N为0时,输入结束,该用例不被处理。

    Output

    对每个测试用例,在1行里输出最小的公路总长度。

    Sample Input

    3

    1 2 1

    1 3 2

    2 3 4

    4

    1 2 1

    1 3 4

    1 4 1

    2 3 3

    2 4 2

    3 4 5

    0

    Sample Output

    3

    5

    #include<string.h>
    #include<algorithm>
    #include<stdio.h>
    #define maxn 100
    #define maxm 5000
    using namespace std;
    struct edge
    {
        int u,v,w;
    }edges[maxm];
    int parent[maxn];
    int N,M;
    int i,j;
    void ufset()
    {
        for(i=1;i<=N;i++)
            parent[i]=-1;
    }
    int find(int x)
    {
        int s;
        for(s=x;parent[s]>=0;s=parent[s]);
        while(s!=x)
        {
            int temp=parent[x];
            parent[x]=s;
            x=temp;
        }
        return s;
    }
    void Union(int R1,int R2)
    {
        int r1=find(R1),r2=find(R2);
        int temp=parent[r1]+parent[r2];
        if(parent[r1]>parent[r2])
        {
            parent[r1]=r2;parent[r2]=temp;
        }
        else
        {
            parent[r2]=r1;parent[r1]=temp;;
        }
    }
    int cmp(const void *a,const void *b)
    {
        edge aa=*(const edge *)a;edge bb=*(const edge *)b;
        return aa.w-bb.w;
    }
    void kruskal()
    {
        int sumweight=0;
        int num=0;
        int u,v;
        ufset();
        for(i=0;i<M;i++)
        {
            u=edges[i].u;v=edges[i].v;
            if(find(u)!=find(v))
            {
                sumweight+=edges[i].w;num++;
                Union(u,v);
            }
            if(num>=N-1)break;
        }
        printf("%d
    ",sumweight);
    }
    int main()
    {
        int u,v,w;
        while(scanf("%d",&N)&&N)
        {
            M=N*(N-1)/2;
            for(int i=0;i<M;i++)
            {
                scanf("%d%d%d",&u,&v,&w);
                edges[i].u=u;edges[i].v=v;edges[i].w=w;
            }
            qsort(edges,M,sizeof(edges[0]),cmp);
            kruskal();
        }
        return 0;
    }
    

      

  • 相关阅读:
    模拟赛QAQ
    复习计划
    luogu P1080 国王游戏
    [NOIP2012T3]开车旅行
    luogu P1967 货车运输
    同余方程组的扩展欧几里得解法
    luogu P1476 休息中的小呆
    GRYZY #13. 拼不出的数
    GRYZY- #10. 财富
    GRYZY #8. 公交车
  • 原文地址:https://www.cnblogs.com/zhangliu/p/7057967.html
Copyright © 2020-2023  润新知