• hdu 1863 畅通工程 最小生成树+并查集


    畅通工程

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


    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
    ?

     这道题将最小生成树和并查集结合起来了(当然,kruskal算法本来就要用到并查集的算法)
    代码:
    View Code
     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <string.h>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 struct node{
     8     int x,y,l;            // 每一条边的起点和终点,l是变得权值
     9 }road[5000];
    10 int pre[105];            //父节点,
    11 bool flag[105];            // 用于判断最后是否只剩一棵树
    12 
    13 bool cmp (node a ,node b)
    14 {
    15     return a.l<b.l;
    16 }
    17 
    18 int find(int x)
    19 {
    20     if(pre[x]!=x)
    21         pre[x]=find(pre[x]);
    22     return pre[x];
    23 }
    24 
    25 int Union(int a,int b)            //合并两点
    26 {
    27     int x=find(a);
    28     int y=find(b);
    29     if(x==y) return 1;
    30     else 
    31     {
    32         pre[y]=x;
    33         return 0;
    34     }
    35 }
    36 
    37 int main()
    38 {
    39     int n,m,i,j;
    40     while(1)
    41     {
    42         scanf("%d%d",&n,&m);
    43         if(n==0) break;
    44         int ans=0;
    45         for(i=1;i<=m;i++)
    46             pre[i]=i;
    47         memset(flag,false,sizeof(flag));
    48         for(i=1;i<=n;i++)
    49             scanf("%d%d%d",&road[i].x,&road[i].y,&road[i].l);
    50         sort(road+1,road+n+1,cmp);
    51         
    52         for(i=1;i<=n;i++)
    53         {
    54             if(Union(road[i].x,road[i].y)==0)
    55                 ans+=road[i].l;
    56         }
    57 
    58         for(i=1;i<=m;i++)
    59             flag[find(i)]=true;
    60         int k=0;
    61         for(i=1;i<=m;i++)
    62         {
    63             if(flag[i]==true)
    64                 k++;
    65         }
    66         if(k!=1) printf("?\n");
    67         else printf("%d\n",ans);
    68     }
    69     return 0;
    70 }

            

  • 相关阅读:
    编程习俗和设计模式
    Design Patterns Quick Memo
    Monty Hall Problem
    RPG game: the lost Roman Army
    A Geeky Game Idea
    App自动化测试:等待webview页面数据加载完成
    Android自动化测试元素定位
    IOS苹果开发者免费证书申请&使用Xcode打包
    pytest测试夹具(fixture)简介
    Unittest与Pytest参数化区别
  • 原文地址:https://www.cnblogs.com/shenshuyang/p/2623680.html
Copyright © 2020-2023  润新知