zoukankan      html  css  js  c++  java
  • [HAOI2009]毛毛虫(树的直径)

    题面

    原题

    Solution

    显然可以发现这道题目可以树形Dp?
    那么我们也可以考虑别的东西比如说直径?
    因为我们知道直径是一条链?
    所以就可以抠出来这一条链然后再加?
    你问我这样子为什么过?
    因为你考虑如果存在一个别的不属于直径的链,显然不能使答案变长?
    于是就可以这么愉快地做了?

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<math.h>
    #include<algorithm>
    #include<iostream>
    #include<queue>
    #define ll long long
    #define file(a) freopen(a".in","r",stdin)//;freopen(a".out","w",stdout)
    using namespace std;
    inline int gi(){
    	int sum=0,f=1;char ch=getchar();
    	while(ch>'9' || ch<'0'){if(ch=='-')f=-f;ch=getchar();}
    	while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
    	return f*sum;
    }
    inline ll gl(){
    	ll sum=0,f=1;char ch=getchar();
    	while(ch>'9' || ch<'0'){if(ch=='-')f=-f;ch=getchar();}
    	while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
    	return f*sum;
    }
    const int N=300010;
    int to[N<<1],nxt[N<<1],front[N],cnt,dp[N];
    void Add(int u,int v){
    	to[++cnt]=v;nxt[cnt]=front[u];front[u]=cnt;
    }
    int MaxAns=0,id,in[N];
    void dfs(int u,int fa,int sum){
    	if(MaxAns<sum){
    		MaxAns=sum;id=u;
    	}
    	for(int i=front[u];i;i=nxt[i])if(to[i]!=fa)dfs(to[i],u,sum+in[u]);
    }
    int main(){
    	int i,j,n,m,k;
    	n=gi();m=gi();memset(in,-1,sizeof(in));
    	for(i=1;i<=m;i++)
    	{
    		int u=gi(),v=gi();
    		Add(u,v);Add(v,u);in[u]++;in[v]++;
    	}
    	dfs(1,1,0);dfs(id,id,in[id]);
    	printf("%d
    ",MaxAns+2);
    	return 0;
    }
    
  • 相关阅读:
    jQuery使用工具集
    JQuery解决鼠标单双击冲突问题
    线程池
    配置文件application.properties参数详解
    SpringBoot整合SpringDataJPA
    获取数据库的自增主键(六)
    【使用篇二】邮箱自动化配置集成(18)
    Quartz自动化配置集成
    Cron表达式详解
    标准盒模型和怪异盒模型的区别
  • 原文地址:https://www.cnblogs.com/cjgjh/p/9846188.html
Copyright © 2011-2022 走看看