zoukankan      html  css  js  c++  java
  • HDU 1879 继续畅通工程 (最小生成树)

    继续畅通工程

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 13765    Accepted Submission(s): 5992


    Problem Description
    省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。
     
    Input
    测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 );随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,0表示未建。

    当N为0时输入结束。
     
    Output
    每个测试用例的输出占一行,输出全省畅通需要的最低成本。
     
    Sample Input
    3 1 2 1 0 1 3 2 0 2 3 4 0 3 1 2 1 0 1 3 2 0 2 3 4 1 3 1 2 1 0 1 3 2 1 2 3 4 1 0
     
    Sample Output
    3 1 0
     
    Author
    ZJU
     
    Source
     
    Recommend
     
     
    这道题还是最小生成树
    kruskal算法,只是这里要把已经修好的路的价值变为0即可
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<stdlib.h>
     4 #include<algorithm>
     5 using namespace std;
     6 const int MAXN=20000+10;
     7 struct node
     8 {
     9     int star;
    10     int en;
    11     int val;
    12     bool operator <(const node &B)const
    13     {
    14         return val<B.val;
    15     }
    16 }a[MAXN];
    17 int p[MAXN];
    18 int Find(int x)
    19 {
    20     return p[x]==x?x:p[x]=Find(p[x]);
    21 }
    22 
    23 int main()
    24 {
    25     //freopen("in.txt","r",stdin);
    26     int n;
    27     while(scanf("%d",&n)&&n)
    28     {
    29         int temp,val;
    30         int num=n*(n-1)/2;
    31         for(int i=1;i<=num;i++)
    32         {
    33             scanf("%d %d %d %d",&a[i].star,&a[i].en,&val,&temp);
    34             if(temp==1)
    35                 a[i].val=0;
    36             else
    37                 a[i].val=val;
    38         }
    39         sort(a+1,a+num+1);
    40         for(int i=1;i<=num;i++)
    41             p[i]=i;
    42         int ans=0,cnt=0;
    43         for(int i=1;i<=num;i++)
    44         {
    45             int x=Find(a[i].star);
    46             int y=Find(a[i].en);
    47             if(x!=y)
    48             {
    49                 p[x]=y;
    50                 ans+=a[i].val;
    51                 cnt++;
    52             }
    53         }
    54             printf("%d
    ",ans);
    55     }
    56     return 0;
    57 }
    View Code
  • 相关阅读:
    mybatis 框架 的应用之四(一对一 与 一对多)
    mybatis 框架 的应用之三(操作两张没有关联的表,存在主键和外键关系)
    mybatis 框架 的应用之二(批量添加、实现分页查询)
    hibernate 框架的简单使用
    Java c3p0 连接 MySQL
    Oracle 复制表
    web 应用中访问 Spring 具体实现
    oracle 创建表 外键约束
    oracle 通过序列实现某字段自增
    Swift数组的sort、filter、forEach、map等方法,$的使用
  • 原文地址:https://www.cnblogs.com/clliff/p/3904047.html
Copyright © 2011-2022 走看看