2435: [Noi2011]道路修建

来源:互联网 发布:nginx的内置对象 编辑:程序博客网 时间:2024/05/22 08:11

题目链接

题目大意:n个点,建立生成树,边的费用等于道路长度乘以道路两端的国家个数之差的绝对值,给定方案,求费用

题解:树形dp,会dfs就可以做了

我的收获:这是noi……

#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int M=1000005;int n,t,head[M],sz[M];long long ans;struct edge{int to,nex,val;}e[M*2];void add(int i,int j,int w){e[t].to=j,e[t].nex=head[i],e[t].val=w,head[i]=t++;}void dfs(int x,int fa){    sz[x]=1;    for(int i=head[x];i!=-1;i=e[i].nex){        int v=e[i].to;        if(v==fa) continue;        dfs(v,x);sz[x]+=sz[v];        ans+=(long long)e[i].val*abs((n-sz[v])-sz[v]);// have known sz[v],not sz[x]……     }}void work(){    dfs(1,0);    cout<<ans<<endl;}void init(){    int x,y,z;    cin>>n;t=0;    memset(head,-1,sizeof(head));    for(int i=1;i<n;i++)        scanf("%d%d%d",&x,&y,&z),add(x,y,z),add(y,x,z);}int main(){    init();    work();    return 0;} 
原创粉丝点击