zoukankan      html  css  js  c++  java
  • hdu 1232 并查集 或者 深搜

    起先,队友和我说过并查集,但是看到这道题目的时候我想还是暂时不用,先凭自己的想法做一下的好,所以就自己闷着脑袋开始做了,然后就开始自己的深搜的,反正这个城市给我的的道路我们建好了一个图之后,只要发现这个图里面的一条边的话我们就计算一次,然后累加,最后组成一个连通图的最小边数就是n-1,所以只要拿n-1-累加的边数就可以了啊。。  

    代码具体如下:

    View Code
     1   #include<iostream>
     2   using namespace std;
     3   int f[1002][1002],Count,visit[1002];
     4   int n,m;
     5   void dfs(int j)
     6   {
     7        for(int i=0;i<n;i++)
     8        {
     9            if(f[j][i]==1&&!visit[i])
    10            {
    11                Count++;
    12                visit[i]=1;
    13                dfs(i);                        
    14            }
    15        }
    16   }
    17   int main()
    18   {
    19       int s,e;
    20       while(scanf("%d",&n)&&n)
    21       {
    22             scanf("%d",&m);
    23             for(int i=0;i<n;i++)
    24             {
    25                for(int j=0;j<n;j++)
    26                {
    27                   f[i][j]=-1;        
    28                }
    29                visit[i]=0;
    30             }
    31             Count=0;
    32             for(int i=0;i<m;i++)
    33             {
    34                scanf("%d%d",&s,&e);
    35                f[s-1][e-1]=1;
    36                f[e-1][s-1]=1;
    37             }
    38             
    39             for(int i=0;i<n;i++)
    40             {
    41                if(!visit[i])
    42                {
    43                   visit[i]=1;
    44                   dfs(i);        
    45                }
    46             }
    47             printf("%d\n",n-1-Count);
    48       }
    49       return 0;    
    50   }
    51   第一个代码可能写得有些笨了,所以其实可以看一下下面的代码。
    52   通过并查集,每次我们并列两个新的点,那么这条边我们就不用再建了,累加边。按上面的道理,我就不说了。。
    53   #include<iostream>
    54   using namespace std;
    55   int n,m,Count;
    56   int father[1002];
    57   int getfather(int i)
    58   {
    59      if(father[i]==i)return i;
    60      return getfather(father[i]);
    61   }
    62   void combine(int x,int y)
    63   {
    64       if(getfather(x)==getfather(y))return ;
    65       Count++;
    66       father[getfather(y)]=x;  
    67   }
    68   int main()
    69   {
    70      int s,e; 
    71      while(scanf("%d",&n)&&n)
    72      {
    73             scanf("%d",&m);
    74             Count=0;
    75             for(int i=1;i<=n;i++)
    76             father[i]=i;
    77             for(int i=0;i<m;i++)
    78             {
    79                 scanf("%d%d",&s,&e);
    80                 combine(s,e);
    81             }
    82             printf("%d\n",n-1-Count);
    83      }
    84      return 0;    
    85   }
  • 相关阅读:
    c语言 inline函数
    ubuntu18.04 安装新版本openssl
    convert_mnist_data.cpp
    caffe 安装方法和记录
    【转】jdbc:oracle:thin:@localhost:1521:orcl与jdbc:oracle:thin:@//localhost:1521/orcl区别
    【原创】【HCIA】验证GaussDB 100系统函数to_nchar()是否能支持最大字节长度8000
    【原创】达梦数据库DM7备份与恢复
    【LINUX】操作系统时钟与硬件时钟设置
    【文档】ORACLE RAC 修改SCAN监听端口、VIP网络配置参考文档
    【转】11G R2 RAC: HOW TO IDENTIFY THE MASTER NODE IN RAC
  • 原文地址:https://www.cnblogs.com/nuoyan2010/p/2667102.html
Copyright © 2011-2022 走看看