HDU2196 Computer(樹形DP)

來源:互聯網
上載者:User

標籤:

和LightOJ1257一樣,之前我用了樹分治寫了。其實原來這題是道經典的樹形DP,感覺這個DP不簡單。。

  • dp[0][u]表示以u為根的子樹中的結點與u的最遠距離
  • dp[1][u]表示以u為根的子樹中的結點與u的次遠距離

這兩個可以一遍dfs通過兒子結點轉移得到。顯然dp[0][u]就是u的一個可能的答案,即u往下走的最遠距離,還缺一部分就是u往上走的最遠距離:

  • dp[2][u]表示u往上走的最遠距離

對於這個的轉移,分兩種情況,是這樣的:

  1. dp[2][v] = max( dp[0][u]+weight(u,v) , dp[2][u]+weight(u,v) ) (v是u的兒子 且 u往下走的最遠距離不經過v)
  2. dp[2][v] = max( dp[1][u]+weight(u,v) , dp[2][u]+weight(u,v) ) (v是u的兒子 且 u往下走的最遠距離經過v)

再一遍dfs就能得到。

 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 #define MAXN 11111 6 struct Edge{ 7     int v,w,next; 8 }edge[MAXN<<1]; 9 int NE,head[MAXN];10 void addEdge(int u,int v,int w){11     edge[NE].v=v; edge[NE].w=w;12     edge[NE].next=head[u]; head[u]=NE++;13 }14 long long d[3][MAXN];15 int idx[MAXN];16 void dfs0(int u,int fa){17     long long mx0=0,mx1=0;18     for(int i=head[u]; i!=-1; i=edge[i].next){19         int v=edge[i].v;20         if(v==fa) continue;21         dfs0(v,u);22         if(mx0<=d[0][v]+edge[i].w) mx1=mx0,mx0=d[0][v]+edge[i].w,idx[u]=v;23         else if(mx1<d[0][v]+edge[i].w) mx1=d[0][v]+edge[i].w;24         else if(mx1<d[1][v]+edge[i].w) mx1=d[1][v]+edge[i].w;25     }26     d[0][u]=mx0; d[1][u]=mx1;27 }28 void dfs1(int u,int fa){29     for(int i=head[u]; i!=-1; i=edge[i].next){30         int v=edge[i].v;31         if(v==fa) continue;32         if(idx[u]==v) d[2][v]=max(d[1][u]+edge[i].w,d[2][u]+edge[i].w);33         else d[2][v]=max(d[0][u]+edge[i].w,d[2][u]+edge[i].w);34         dfs1(v,u);35     }36 }37 int main(){38     int n,a,b;39     while(~scanf("%d",&n)){40         NE=0;41         memset(head,-1,sizeof(head));42         for(int i=2; i<=n; ++i){43             scanf("%d%d",&a,&b);44             addEdge(i,a,b); addEdge(a,i,b);45         }46         memset(d,0,sizeof(d));47         dfs0(1,1);48         dfs1(1,1);49         for(int i=1; i<=n; ++i){50             printf("%lld\n",max(d[0][i],d[2][i]));51         }52     }53     return 0;54 }

 

HDU2196 Computer(樹形DP)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.