【codevs1814】最长链

本来是去找最小生成树的题目的,在codevs搜索一番,打开了它,结果……这和最小生成树有啥关系啊qwq,这个题就是个树形dp啊qwq

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
struct in
{
    int l,r;
}ter[100010];
int n,x,y,tail,ans,head[100010],dp[100010];
void dfs(int ro)
{
    if(ter[ro].l==0&&ter[ro].r==0)//如果没有蛾子直接返回 
        return;
    if(ter[ro].l)//有左蛾子就向左跑 
        dfs(ter[ro].l);
    if(ter[ro].r)//有右蛾子向右跑 
        dfs(ter[ro].r);
    dp[ro]=max(dp[ter[ro].l],dp[ter[ro].r])+1;//选取经过这个点的链最大值 
    int tot=0;
    if(ter[ro].l)
        tot+=dp[ter[ro].l]+1;
    if(ter[ro].r)
        tot+=dp[ter[ro].r]+1;
    ans=max(ans,tot);//因为树上最长链不一定经过根节点,真·套路  
}
int main()
{
    scanf("%d",&n);
    memset(head,-1,sizeof(head));
    for(int i=1;i<=n;i++)
        scanf("%d%d",&x,&y),ter[i].l=x,ter[i].r=y;//建图 
    dfs(1);
    printf("%d",ans);
}//恕我直言,这个题和最小生成树有关系吗qwq 

 

posted @ 2017-10-21 07:28  那一抹落日的橙  阅读(216)  评论(0编辑  收藏  举报