• hdu_1863_畅通工程_201403122000


    畅通工程

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 14215    Accepted Submission(s): 5875


    Problem Description
    省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
     
    Input
    测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后的 N
    行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
     
    Output
    对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。
     
    Sample Input
    3 3 1 2 1 1 3 2 2 3 4 1 3 2 3 2 0 100
     
    Sample Output
    3 ?
     
    Source
     
     1 #include <cstdio>
     2 #include <iostream>
     3 #include <cstring>
     4 //#include <algotithm>
     5 #include <stdlib.h>
     6 using namespace std;
     7 typedef struct IN
     8 {
     9     int a;
    10     int b;
    11     int c;
    12 }IN;
    13 IN s[5000];
    14 int N,M;
    15 int pre[110];
    16 int cmp(const void *a,const void *b)
    17 {
    18     return (*(IN *)a).c - (*(IN *)b).c;
    19 }
    20 int find(int x)
    21 {
    22     int i,r,t;
    23     r=x;
    24     while(r!=pre[r])
    25     r=pre[r];
    26     while(x!=r)
    27     {
    28         i=pre[x];
    29         pre[x]=r;
    30         x=i;
    31     }
    32     return r;
    33 }
    34 int kruskal()
    35 {
    36     int i,j,pa,pb,num=0,sum=0;
    37     for(i=0;i<=M;i++)
    38     pre[i]=i;
    39     for(i=0;i<N;i++)
    40     {
    41         pa=find(s[i].a);
    42         pb=find(s[i].b);
    43         if(pa!=pb)
    44         {
    45             pre[pa]=pb;
    46             sum+=s[i].c;
    47             num++;
    48         }
    49     }
    50     if(num==M-1)
    51     return sum;
    52     else
    53     return 0;
    54 }
    55 int main()
    56 {
    57     while(scanf("%d %d",&N,&M),N)
    58     {
    59         int i,j,t;
    60         memset(s,0,sizeof(s));
    61         for(i=0;i<N;i++)
    62         scanf("%d %d %d",&s[i].a,&s[i].b,&s[i].c);
    63         qsort(s,N,sizeof(s[0]),cmp);
    64         //for(i=0;i<N;i++)
    65         //printf("%d
    ",s[i].c);
    66         t=kruskal();
    67         if(t)
    68         printf("%d
    ",t);
    69         else
    70         printf("?
    ");
    71     }
    72     return 0;
    73 }
  • 相关阅读:
    2017《面向对象程序设计》课程作业八
    2017《面向对象程序设计》课程作业七
    第六次作业
    2017《面向对象程序设计》课程作业五
    课程作业四
    2017《面向对象程序设计》课程作业三
    2017《面向对象程序设计》课程作业二
    2017《面向对象程序设计》课程作业一
    20200924 次小生成树
    水文章_考拉
  • 原文地址:https://www.cnblogs.com/xl1027515989/p/3597224.html
Copyright © 2020-2023  润新知