zoukankan      html  css  js  c++  java
  • [USACO19JAN]Grass Plantin

    本人水平有限,题解不到为处,请多多谅解

    本蒟蒻谢谢大家观看

    题目:传送门

    乍一看,用dfs遍历树在七搞八搞,最后怀着激动的心情提交,AC三个点,TLE七个点

    30分代码:

     1 #include<bits/stdc++.h>
     2 #pragma GCC optimize(3)
     3 const int N=5e5+100;
     4 using namespace std;
     5 int n,tot,cnt=1,ans;
     6 int ver[N],head[N],nxt[N],f[N],vis[N];
     7 void inint(){
     8     freopen("grass.in","r",stdin);
     9     freopen("grass.out","w",stdout);
    10 }
    11 inline int read(){
    12     int x=0,f=1;char ch=getchar();
    13     while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    14     while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    15     return x*f;
    16 }
    17 void add(int x,int y){
    18     ++tot;
    19     ver[tot]=y;
    20     nxt[tot]=head[x];
    21     head[x]=tot;
    22 }
    23 void dfs(int x,int fa){
    24     f[x]=fa;
    25     for(int i=head[x];i;i=nxt[i]){
    26         int y=ver[i];
    27         if(y!=fa){
    28             f[y]=x;
    29             dfs(y,x);
    30         }
    31     }
    32 }
    33 int main()
    34 {
    35     //inint();
    36     n=read();    
    37     memset(vis,1,sizeof(vis));
    38     for(int i=1;i<n;i++){
    39         int x,y;
    40         x=read(),y=read();
    41         add(x,y),add(y,x);
    42     }    
    43     dfs(1,0);
    44     for(int i=1;i<=n;i++)vis[i]=1;
    45     for(int i=1;i<=n;i++){
    46         for(int j=1;j<=n;j++){
    47             if(f[j]==i&&i!=j){
    48                 if(vis[j]==vis[i]){
    49                     vis[j]=vis[j]+1;
    50                 }
    51             }
    52             if(f[i]==f[f[j]]&&i!=j){
    53                 if(vis[i]==vis[f[j]]){
    54                     vis[j]=vis[j]+1;
    55                 }
    56                 if(f[j]==i&&i!=j){
    57                     if(vis[j]==vis[i]){
    58                         vis[j]=vis[j]+1;
    59                     }
    60                 }            
    61             }
    62         }
    63     }
    64     for(int i=1;i<=n;i++)ans=max(ans,vis[i]);
    65     printf("%d
    ",ans);
    66     return 0;
    67 }
    68 /*
    69 4
    70 1 2
    71 4 3
    72 2 3
    73 
    74 7
    75 1 2
    76 1 3
    77 2 4
    78 2 5
    79 3 6
    80 3 7
    81 */

    仔细一想,这不就是统计树上点的度吗?

    因为是无向图,所以  入度==出度直接类似于桶排,因为只要有需要统计的数出现,我们记一个num数组,num[i]++;可以统计该点的度。因为只要有点与该点连边,该点与连点就会出现在输入样例中,直接统计即可。

    注意:最后答案要+1,因为自身初始时就已经有一种情况了

    code:

     1 #include<bits/stdc++.h>
     2 #pragma GCC optimize(3)
     3 const int N=5e5+100;
     4 using namespace std;
     5 int n,ans;
     6 int num[N];
     7 inline int read(){
     8     int x=0,f=1;char ch=getchar();
     9     while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    10     while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    11     return x*f;
    12 }
    13 inline void write(int x){
    14      char F[200];
    15      int tmp=x>0?x:-x ;
    16      if(x<0)putchar('-') ;
    17      int cnt=0 ;
    18         while(tmp>0)
    19         {
    20             F[cnt++]=tmp%10+'0';
    21             tmp/=10;
    22         }
    23         while(cnt>0)putchar(F[--cnt]) ;
    24 }
    25 int main()
    26 {
    27     n=read();
    28     for(int i=1,x,y;i<n;i++){
    29         x=read(),y=read();
    30         num[x]++,num[y]++;
    31     }
    32     for(int i=1;i<=n;i++){
    33         ans=max(ans,num[i]);
    34     }
    35     printf("%d
    ",ans+1);
    36     return 0;
    37 }
  • 相关阅读:
    SpringBoot配置Druid数据源
    springboot自定义异常处理
    SpringBoot配置详解
    设计模式 | 模板方法模式(template method)
    设计模式 | 原型模式(prototype)
    设计模式 | 工厂方法模式(factory method)
    设计模式 | 代理模式(proxy)
    设计模式 | 装饰模式(decorator)
    设计模式 | 策略模式(strategy)
    设计模式 | 简单工厂模式(static factory method)
  • 原文地址:https://www.cnblogs.com/nlyzl/p/11694964.html
Copyright © 2011-2022 走看看