zoukankan      html  css  js  c++  java
  • 6.1.3 畅通工程

    畅通工程

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

    Problem Description
    某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
     

    Input
    测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到N编号。
    注意:两个城市之间可以有多条道路相通,也就是说
    3 3
    1 2
    1 2
    2 1
    这种输入也是合法的
    当N为0时,输入结束,该用例不被处理。
     

    Output

                对每个测试用例,在1行里输出最少还需要建设的道路数目。
     

    Sample Input
    4 2
    1 3
    4 3
    3 3
    1 2
    1 3
    2 3
    5 2
    1 2
    3 5
    999 0
    0
     

    Sample Output
    1
    0
    2
    998
    Hint
    Hint
    Huge input, scanf is recommended.

    思路:并查集啊!!!居然WA了三次,原因是并查集的合并操作应该是合并祖先节点!我居然合并的是当前节点啊!!!!(水题一道啊!)

     1 #include <cstdio>
     2 #include <cstring>   
     3 #include <iostream>
     4 #include <cmath>
     5 #include <algorithm>
     6 #include <cstdlib>
     7 using namespace std;
     8 
     9 const int maxn=1100;
    10 int f[maxn];
    11 int x,y,n,m;
    12 
    13 void close()
    14 {
    15     exit(0);
    16 }
    17 
    18 int find(int k)
    19 {
    20     if (f[k]==k)
    21         return k;
    22     f[k]=find(f[k]);
    23     return f[k];
    24 }
    25 
    26 void init()
    27 {
    28     while (scanf("%d",&n)!=EOF)
    29      {
    30          if (n==0) break;
    31          scanf("%d",&m);
    32          for (int i=1;i<=n;i++)
    33              f[i]=i;
    34          for (int i=1;i<=m;i++)
    35          {
    36              scanf("%d %d",&x,&y);
    37              int t1=find(x);
    38              int t2=find(y);
    39              if (find(x)!=find(y))
    40                  f[t1]=t2;
    41          }
    42 int ans=0;
    43          for (int i=1;i<=n;i++)
    44 if (f[i]==i) ans++;
    45              printf("%d\n",ans-1);
    46      }
    47 }
    48 
    49 
    50 int main ()
    51 {
    52     init();
    53     close();
    54 }
  • 相关阅读:
    报错处理
    MySQL8.0跟5.7分组查询表所有字段
    模拟开始时间、结束时间生成历史时间生成曲线模拟数据
    查询电脑登录过的WiFI账号密码
    Samba服务器架设
    CentOS安装GitLab
    申请域名并使用DDNS
    极路由4增强版(极企版)-刷潘多拉固件
    Git命令
    elasticsearch7.6.2 -canal1.1.4集成
  • 原文地址:https://www.cnblogs.com/cssystem/p/2987886.html
Copyright © 2011-2022 走看看