Codeforces 219D Choosing Capital for Treeland?????????DP???
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 219D Choosing Capital for Treeland?????????DP???相关的知识,希望对你有一定的参考价值。
?????????
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
?????????????????????????????????HDU2196???
- ????????????????????????????????????0?????????????????????1??????????????????????????????????????????????????????????????????????????????
- ????????????????????????????????????????????????????????????????????????????????????????????????????????????
- dp[0][u]?????????u?????????????????????u??????????????????????????????????????????????????????????????????????????????????????????
- dp[1][u]?????????u??????????????????u??????????????????????????????????????????????????????????????????????????????dp[1][v] = ( dp[0][u]-dp[0][v]-weight(u,v) ) + dp[1][u] + weight(v,u) ???v???u????????????
- ???????????????????????????u????????????????????????????????????????????????dp[0][u]+dp[1][u]???
???????????????????????????DP???????????????????????????????????????????????????????????????????????????
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 #define INF (1<<30) 6 #define MAXN 222222 7 struct Edge{ 8 int u,v,w,next; 9 }edge[MAXN<<1]; 10 int NE,head[MAXN]; 11 void addEdge(int u,int v,int w){ 12 edge[NE].u=u; edge[NE].v=v; edge[NE].w=w; 13 edge[NE].next=head[u]; head[u]=NE++; 14 } 15 int d[2][MAXN]; 16 void dfs0(int u,int fa){ 17 for(int i=head[u]; i!=-1; i=edge[i].next){ 18 int v=edge[i].v; 19 if(v==fa) continue; 20 dfs0(v,u); 21 d[0][u]+=d[0][v]+edge[i].w; 22 } 23 } 24 void dfs1(int u,int fa){ 25 for(int i=head[u]; i!=-1; i=edge[i].next){ 26 int v=edge[i].v; 27 if(v==fa) continue; 28 d[1][v]=d[0][u]-d[0][v]-edge[i].w+d[1][u]+edge[i^1].w; 29 dfs1(v,u); 30 } 31 } 32 int main(){ 33 memset(head,-1,sizeof(head)); 34 int n,a,b; 35 scanf("%d",&n); 36 for(int i=1; i<n; ++i){ 37 scanf("%d%d",&a,&b); 38 addEdge(a,b,0); addEdge(b,a,1); 39 } 40 dfs0(1,1); 41 dfs1(1,1); 42 int res=INF; 43 for(int i=1; i<=n; ++i) res=min(res,d[0][i]+d[1][i]); 44 printf("%d\n",res); 45 for(int i=1; i<=n; ++i){ 46 if(res==d[0][i]+d[1][i]){ 47 printf("%d ",i); 48 } 49 } 50 return 0; 51 }
以上是关于Codeforces 219D Choosing Capital for Treeland?????????DP???的主要内容,如果未能解决你的问题,请参考以下文章
Choosing Capital for Treeland CodeForces - 219D (树形DP)
Codeforces 219D Choosing Capital for Treeland:Tree dp
CodeForces 219D Choosing Capital for Treeland (树形DP)