zoukankan      html  css  js  c++  java
  • 杭电1863--畅通工程(并查集)

    畅通工程

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


    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
     
    //此题把确定关系和判断关系放到一块求解;并查集实现Kruskal 算法 ;
     1 #include <stdio.h>
     2 #include <algorithm>
     3 using namespace std ;
     4 int father[1010] ;
     5 struct vilage
     6 {
     7     int a, b, mon ;
     8 } ;
     9 vilage num[1010] ;
    10 bool cmp(vilage a, vilage b)
    11 {
    12     return a. mon < b. mon ; 
    13 }
    14 /* int find(int a) 
    15 {
    16     while(a != father[a])                  //递归压缩路径 ; 
    17     father[a] = find(father[a]) ;
    18     return father[a] ;
    19 } */
    20 int find(int a)                // 非递归压缩路径 ; 
    21 {
    22     int k, j, r ;
    23     r = a ;
    24     while(r != father[r])  //查找根节点 ;
    25     r = father[r] ;        //根节点记录 ; 
    26     k = a ;
    27     while(k != r)          //非递归压缩路径操作 ; 
    28     { 
    29         j = father[k] ;    //j暂存父节点 ; 
    30         father[k] = r ;    //father[a] 指向根节点 ; 
    31         k = j ;            // 移向根节点 ; 
    32     }
    33     return r ;
    34 }
    35 int mercy(int a, int b)   // 
    36 {
    37     int p = find(a) ;
    38     int q = find(b) ;
    39     if(find(p) != find(q))
    40     {
    41         father[p] = q ;
    42         return 1 ;
    43     }
    44     else
    45     return 0 ;
    46 }
    47 int main()
    48 {
    49     int n, m, i, j ;
    50     while(~scanf("%d %d",&n, &m), n)
    51     {
    52         for(i=1; i<=m; i++)
    53         father[i] = i ;
    54         for(j=1; j<=n; j++)
    55         scanf("%d %d %d",&num[j].a, &num[j].b, &num[j].mon) ;
    56         sort(num+1, num+n+1, cmp) ;
    57         int total = 0 ; 
    58         for(i=1; i<=n; i++)
    59         {
    60             if(mercy(num[i].a, num[i].b))
    61             total += num[i].mon ;
    62         }
    63         int sum = -1 ;
    64         for(i=1; i<=m; i++)
    65         if(father[i] == i)
    66         sum++ ;
    67         
    68         if(!sum)
    69         printf("%d
    ", total) ;
    70          else
    71          printf("?
    ") ;
    72     }
    73     return 0 ;
    74 }

      

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 int father[1010];
     7 int n, m;
     8 struct rode
     9 {
    10     int a, b, m;    
    11 } num[1010];
    12 bool cmp(rode a, rode b)
    13 {
    14     return a.m < b.m;
    15 }
    16 void init()
    17 {
    18     for(int i = 1; i <= n; i++)
    19         father[i] = i;
    20 }
    21 int find(int a)
    22 {
    23     if(a == father[a])
    24         return a;
    25     else 
    26         return father[a] = find(father[a]);    
    27 } 
    28 bool mercy(int a, int b)
    29 {
    30     int q =  find(a);
    31     int p =  find(b);
    32     if(q != p)
    33     {
    34         father[q] = p;
    35         return true;
    36     }
    37     else 
    38         return false;
    39 } 
    40 int main()
    41 {
    42     while(~scanf("%d %d", &m, &n), m)
    43     {
    44         int u, v, w;
    45         init(); 
    46         for(int i = 0; i < m; i++)
    47             scanf("%d %d %d", &num[i].a, &num[i].b, &num[i].m);
    48         sort(num, num + m, cmp);
    49         int sum = 0;
    50         for(int i = 0; i < m; i++)
    51         {
    52             if(mercy(num[i].a, num[i].b))
    53                 sum += num[i].m;
    54         }
    55         int total = 0; 
    56         for(int i = 1; i <= n; i++)
    57             if(father[i] == i)
    58                 total++;
    59         if(total == 1)
    60             printf("%d
    ", sum);
    61         else
    62             printf("?
    ");
    63     }
    64     return 0;
    65 }
    留念

     //非递归路径压缩,应该差不多了 ;

     1 int find(int a)                // 非递归压缩路径 ; 
     2 {
     3     int k, j, r ;
     4     r = a ;
     5     while(r != father[r])  //查找根节点 ;
     6     r = father[r] ;        //根节点记录 ; 
     7     /*k = a ;
     8     while(k != r)          //非递归压缩路径操作 ; 
     9     { 
    10         j = father[k] ;    //j暂存父节点 ; 
    11         father[k] = r ;    //father[a] 指向根节点 ; 
    12         k = j ;            // 移到父节点 ; 
    13     }*/
    14     
    15     return r ;
    16 }
    View Code
     
  • 相关阅读:
    SpringBoot条件注解@Conditional
    IDEA远程Debug
    聊一聊Java如何接入招行一网通支付功能
    IDEA中使用lombok插件
    使用Java类加载SpringBoot、SpringCloud配置文件
    Java项目启动时执行指定方法的几种方式
    Java定时任务解决方案
    04 Python并发编程(守护进程,进程锁,进程队列)
    03 初识并发编程
    02 网络编程协议(TCP和UDP协议,黏包问题)以及socketserver模块
  • 原文地址:https://www.cnblogs.com/soTired/p/4609408.html
Copyright © 2011-2022 走看看