• 还是畅通工程(1233 并查集+kruskal)


    还是畅通工程

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


    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
    Hint
    Hint
    Huge input, scanf is recommended.
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 using namespace std;
     5 #define Max 100000
     6 int par[Max];
     7 int n;
     8 struct edge
     9 {
    10     int v,u,cost;
    11 }es[10000];
    12 void init()
    13 {
    14     for(int i=0;i<Max;i++)
    15         par[i]=i;        //每个节点的根节点都是自己本身
    16 }
    17 int find(int x)
    18 {
    19     if(par[x]==x)
    20         return x;
    21     else
    22         return par[x]=find(par[x]);    //找父节点
    23 }
    24 void unite(int x,int y)
    25 {
    26     int x0=find(x);
    27     int y0=find(y);
    28     if(x0==y0)
    29         return;
    30     else
    31         par[x0]=y0;
    32 }
    33 bool same(int x,int y)
    34 {
    35     return find(x)==find(y);
    36 }
    37 bool cmp(edge a,edge b)
    38 {
    39     return a.cost<=b.cost;
    40 }
    41 int main()
    42 {
    43     int i,j;
    44     freopen("in.txt","r",stdin);
    45     while(scanf("%d",&n)&&n)
    46     {
    47         init();
    48         int sum=0;
    49         for(i=0;i<n*(n-1)/2;i++)
    50             scanf("%d%d%d",&es[i].v,&es[i].u,&es[i].cost);
    51         sort(es,es+n*(n-1)/2,cmp);
    52         for(i=0;i<n*(n-1)/2;i++)
    53         {
    54             edge e=es[i];
    55             if(!same(e.v,e.u))
    56             {
    57                 sum+=e.cost;
    58                 unite(e.v,e.u);
    59             }
    60         }
    61         printf("%d
    ",sum);
    62     }
    63     
    64 }
  • 相关阅读:
    osg::BlendFunc来设置透明度
    LCA(Tarjan)
    CODEVS1073 家族 (并查集)
    CODEVS1533 互斥的数(哈希表)
    2014-12-4
    BZOJ2661 连连看 (费用流)
    2014-11-30
    JAVA语法基础作业——动手动脑以及课后实验性问题
    课后作业01——相加
    再读大道至简第二章
  • 原文地址:https://www.cnblogs.com/a1225234/p/5041160.html
Copyright © 2020-2023  润新知