[noi2011]道路修建 树形dp

Posted CHADLZX

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[noi2011]道路修建 树形dp相关的知识,希望对你有一定的参考价值。

这道题可以说是树形dp的入门题,也可以看成是一道检验【树】这个数据结构的题目;

这道题只能bfs,毕竟10^6的复杂度win下肯定爆栈了;

但是最恶心的还不是这个,实测用printf输出

用cout输出

题上也不提醒一下,无语啦;

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cstdlib>
 6 #include<string>
 7 #include<iomanip>
 8 #include<cmath>
 9 using namespace std;
10 #define LL long long
11 const int maxn=1003000;
12 int n;
13 struct node{
14     int y,next,v;
15 }e[maxn<<1];
16 int linkk[maxn],len=0,siz[maxn],q[maxn],tail=0,fa[maxn],t[maxn],top=0,ru[maxn],w[maxn];
17 LL ans=0;
18 void insert(int x,int y,int v){
19     e[++len].y=y;
20     e[len].next=linkk[x];
21     e[len].v=v;
22     linkk[x]=len;
23 }
24 void init(){
25     scanf("%d",&n);
26     int x,y,v;
27     for(int i=1;i<n;i++){
28         scanf("%d%d%d",&x,&y,&v);
29         insert(x,y,v);insert(y,x,v);
30     }
31 }
32 void bfs(){
33     q[++tail]=1;int x;
34     for(int head=1;head<=tail;head++){
35         x=q[head];
36         for(int i=linkk[x];i;i=e[i].next){
37             if(e[i].y==fa[x])continue;
38             q[++tail]=e[i].y;
39             fa[e[i].y]=x;
40             ru[x]++;
41             w[e[i].y]=e[i].v;
42         }
43         if(!ru[x])t[++top]=x;
44     }
45     for(int head=1;head<=top;head++){
46         x=t[head];siz[x]++;
47         siz[fa[x]]+=siz[x];
48         ru[fa[x]]--;
49         if(!ru[fa[x]])t[++top]=fa[x];
50         ans+=(LL)abs(n-2*siz[x])*(LL)w[x];
51     }
52 }
53 void work(){
54     bfs();
55     cout<<ans<<endl;
56 }
57 int main(){
58     freopen("1.in","r",stdin);
59     freopen("1.out","w",stdout);
60     init();
61     work();
62 }
View Code

 

以上是关于[noi2011]道路修建 树形dp的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ-2435道路修建 (树形DP?)DFS

bzoj2435: [Noi2011]道路修建

2435: [Noi2011]道路修建(树上操作)

NOI2011道路修建 BFS

[NOI2011]道路修建

2435: [Noi2011]道路修建