• HDU 1856


    http://acm.split.hdu.edu.cn/showproblem.php?pid=1856

    对于这道题,主要就是让你求出有最多结点的树的树叶;

    我们只要利用并查集的知识吧所输入的数据连接成树,然后逐一找出树叶最多的树就可以。利用一个num数组,在最开始的时候每个节点自己是一颗树,num[i]=1;在之后把在同一个父亲结点的num[i]连接起来。

    再逐一查找出最大的就可以啦。

    思路就是这样啊,可是我的提交上就是wa,心灰意冷啊,啊,啊啊,啊啊啊。我把我的代码贴上面,希望大神们看见帮我改一改。

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<iostream>
     4 #include<algorithm>
     5 using namespace std;
     6 const int M=10000000;
     7 int fa[M],num[M];
     8 void init(){
     9 for(int i=1;i<=M;i++){
    10     fa[i]=i;
    11     num[i]=1;
    12 }
    13 }
    14 int fin(int x){
    15 return fa[x]=x?fa[x]:fa[x]=fin(fa[x]);
    16 }
    17 void unin(int x,int y){
    18 int p=fin(x);
    19 int q=fin(y);
    20 if(p!=q){
    21     fa[p]=q;
    22     num[q]+=num[p];
    23 }
    24 }
    25 int main()
    26 {
    27     int n,a,b;
    28     while(~scanf("%d",&n)){
    29         if(n==0){
    30                 printf("1
    ");
    31         continue;
    32         }
    33         int ans=0;
    34         init();
    35         for(int i=0;i<n;i++){
    36             scanf("%d%d",&a,&b);
    37             if(a>ans)ans=a;
    38             if(b>ans)ans=b;
    39             unin(a,b);
    40 
    41         }
    42         int maxn=0;
    43         for(int i=1;i<=ans;i++){
    44             if(num[i]>maxn)
    45                 maxn=num[i];
    46         }
    47         cout<<maxn<<endl;
    48     }
    49     return 0;
    50 }
    View Code

     下面的这个是我在网上查找的大神的代码,我俩除啦参数之外是一样一样的啊,我的咋就不过呢。。。。。

     1 #include<stdio.h>
     2 #define N 10000000
     3 int father[N],num[N];
     4 void initial()/*初始化*/
     5 {
     6     int i;
     7     for(i=1;i<=N;i++)
     8     {
     9         father[i]=i;
    10         num[i]=1;/*开始时数量都为1,根节点为自己*/
    11     }
    12 }
    13 int find(int x) /*寻找根节点*/
    14 {
    15     if(father[x]!=x)
    16         father[x]=find(father[x]);
    17     return father[x];
    18 }
    19 void merge(int a,int b)/*合并a和b*/
    20 {
    21     int p=find(a);
    22     int q=find(b);
    23     if(p!=q)
    24     {
    25         father[p]=q;
    26         num[q]+=num[p];/*合并集合中元素个数*/
    27     }
    28 }
    29 int main()
    30 {
    31     int n,a,b,i,sum,max;
    32     while(~scanf("%d",&n))
    33     {
    34         if(n==0)
    35         {
    36             printf("1
    ");
    37             continue;
    38         }
    39         max=0;
    40         initial(); /*初始化*/
    41         for(i=0;i<n;i++)
    42         {
    43             scanf("%d%d",&a,&b);
    44             if(a>max)
    45                 max=a;
    46             if(b>max)
    47                 max=b;
    48             merge(a,b); /*合并集合*/
    49         }
    50         int Max=0;
    51         for(i=1;i<=max;i++)
    52             if(num[i]>Max) /*查找最大值*/
    53                 Max=num[i];
    54         printf("%d
    ",Max);
    55     }
    56     return 0;
    57 }
    View Code
    你若盛开,清风自来...
  • 相关阅读:
    清除缓冲
    iOS 10 开发 相机相关的适配
    UIImagePickerControllerDelegate---ActionSheet---获得设备型号
    4,4s屏幕过渡页处理
    iOS小技巧3
    UIWebView中Html中用JS调用OC方法及OC执行JS代码
    删除本地文件
    NSArray倒序
    tableView和scrollView滚动起冲突
    在UIScrollView的delegate方法判断滚动快慢
  • 原文地址:https://www.cnblogs.com/shangjindexiaoqingnian/p/5830896.html
Copyright © 2020-2023  润新知