首页 > 代码库 > [noi2011]道路修建 树形dp
[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 long11 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 }
[noi2011]道路修建 树形dp
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。