Codeforces 219D Choosing Capital for Treeland?????????DP???

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 219D Choosing Capital for Treeland?????????DP???相关的知识,希望对你有一定的参考价值。

?????????

????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

?????????????????????????????????HDU2196???

  • ????????????????????????????????????0?????????????????????1??????????????????????????????????????????????????????????????????????????????
  • ????????????????????????????????????????????????????????????????????????????????????????????????????????????
    1. dp[0][u]?????????u?????????????????????u??????????????????????????????????????????????????????????????????????????????????????????
    2. 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)

CodeForces - 219D Choosing Capital for Treeland(树形dp)

codeforces219D

CodeForces - 219D 树形dp