• 【NOI2011T4】道路修建-树形DP


    测试地址:道路修建

    做法:这个水的程度...不太像NOI的难度啊...不妨设点1为根,DFS时顺便求出以每个点为根的子树中点的数量,记为s[i],求完之后回来就可以求出边的费用了,因为任意一点i只有一个父亲,也只有一条连向父亲的边,所以我们算完一个点就求出对应的连向父亲的边的费用,显然cost=c*|s[i]-(n-s[i])|,然后统计总费用即可,注意使用long long。

    以下是本人代码:

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define ll long long
    int n,first[1000010]={0},tot=0;
    bool vis[1000010]={0};
    ll s[1000010],ans=0;
    struct edge {int v,next;ll d;} e[2000010];
    
    void insert(int a,int b,int d)
    {
      e[++tot].v=b,e[tot].d=d,e[tot].next=first[a],first[a]=tot;
    }
    
    void treedp(int v)
    {
      s[v]=1;
      vis[v]=1;
      for(int i=first[v];i;i=e[i].next)
        if (!vis[e[i].v])
    	{
    	  treedp(e[i].v);
    	  s[v]+=s[e[i].v];
    	  ans+=abs(n-2*s[e[i].v])*e[i].d;
    	}
    }
    
    int main()
    {
      scanf("%d",&n);
      for(int i=1,a,b,d;i<n;i++)
      {
        scanf("%d%d%d",&a,&b,&d);
        insert(a,b,d),insert(b,a,d);
      }
      
      treedp(1);
      
      printf("%lld",ans);
      
      return 0;
    }
    


  • 相关阅读:
    20181126-java-面试知识-收集
    redis学习
    ThoughtWorks.QRCode类库
    Microsoft Enterprise Library
    DocX插件
    Aspose 插件
    工厂示例
    面向对象
    WebSocket 是什么原理?为什么可以实现持久连接?
    label标签的作用
  • 原文地址:https://www.cnblogs.com/Maxwei-wzj/p/9793760.html
Copyright © 2020-2023  润新知