【codevs1814】最長鏈
阿新 • • 發佈:2017-10-21
如果 namespace 最大值 最小 dev tdi amp void ()
本來是去找最小生成樹的題目的,在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
【codevs1814】最長鏈