//代码跑的很慢四秒会超时,结尾附两秒代码(标程)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
vector<pair<int,int>>tree[100010];
ll dp[100010][110];/*dp[u][i]表示u节点为根的子树上选择了i个叶子节点,
会经过u这个子树的边的权值和的最优值。转移方程如下:
dp[u][i]=min( dp[u][i-j]+dp[v][j]+w*j*(k-j) );
v是u的子节点,w是u与v之间边的权值,l*(k-l)表示的是这条边会被经过的次数
(j为从v这个树上过来的叶节点数,k-j为其它地方选择的叶节点数)*/
int siz[100010];
int t,n,k;
void dfs(int u,int f)
{
    if(tree[u].size()==1)
    {
        dp[u][0]=0;
        dp[u][1]=0;
        siz[u]=1;//记录叶子节点数量
        return;
    }
    siz[u]=0;
    dp[u][0]=0;
    for(int i=0;i<tree[u].size();i++)
    {
        int v=tree[u][i].first;//联接点
        int w=tree[u][i].second;//权重
        if(v==f)
            continue;
        dfs(v,u);
        siz[u]+=siz[v];
        dp[u][k]=min(dp[u][k],dp[v][k]);//在v上选了k个叶子
        for(int j=min(k,siz[u]);j>=1;j--)//限制j最大为k
        {
            for(int l=1;l<=min(j,siz[v]);l++)
                dp[u][j]=min(dp[u][j],dp[u][j-l]+dp[v][l]+l*(k-l)*w);//状态转移方程
        }
    }
}
int main()
{
    scanf("%d",&t);
    for(int tt=1;tt<=t;tt++)
    {
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++)
            tree[i].clear();
        for(int i=1;i<n;i++)
        {
            int u,v;
            int w;
            scanf("%d%d%lld",&u,&v,&w);
            tree[u].push_back({v,w});
            tree[v].push_back({u,w});
        }
        printf("Case #%d: ",tt);
        if(n==2)
            printf("%d\n",(k==2?tree[1][0].second:0));//当且仅当k==2时存在一条路的长度
        else
        {
            int rt=0;
            for(int i=1;i<=n;i++)
                if(tree[i].size()>1)//找到一个不为叶子节点的节点作根
                {
                    rt=i;
                    break;
                }
            for(int i=1;i<=n;i++)
            {
                dp[i][0]=0;
                for(int j=1;j<=k;j++)
                    dp[i][j]=inf;
            }
            dfs(rt,0);
            printf("%lld\n",dp[rt][k]);
        }
    }
    return 0;
}
 /*标程AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=100005;
const int MAXK=105;
const ll INF=(1LL<<60)-1;
vector<pair<int,int> > e[MAXN];
ll dp[MAXN][MAXK],tmp[MAXK];
int sz[MAXN];
void dfs(int u,int f,int k)
{
    if((int)e[u].size()==1)
    {
        sz[u]=1,dp[u][0]=dp[u][1]=0;
        return;
    }
    sz[u]=0;
    for(auto &t:e[u])
    {
        int v=t.first,c=t.second;
        if(v==f)continue;
        dfs(v,u,k);
        int ts=min(k,sz[u]+sz[v]);
        for(int i=0;i<=ts;i++)
            tmp[i]=INF;
        for(int i=0;i<=sz[u];i++)
            for(int j=0;j<=sz[v] && i+j<=ts;j++)
                tmp[i+j]=min(tmp[i+j],dp[u][i]+dp[v][j]+j*(k-j)*c);
        for(int i=0;i<=ts;i++)
            dp[u][i]=tmp[i];
        sz[u]=ts;
    }
}
int main()
{
    int T;
    scanf("%d",&T);
    for(int ca=1;ca<=T;ca++)
    {
        int n,k;
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n-1;i++)
        {
            int u,w,v;
            scanf("%d%d%d",&u,&v,&w);
            e[u].push_back({v,w});
            e[v].push_back({u,w});
        }
        printf("Case #%d: ",ca);
        if(n==2)printf("%d\n",(k==2 ? e[1][0].second : 0));
        else
        {
            int rt=0;
            for(int i=1;i<=n;i++)
                if((int)e[i].size()>1)rt=i;
            assert(rt);
            dfs(rt,0,k);
            printf("%lld\n",dp[rt][k]);
        }
        for(int i=1;i<=n;i++)
            e[i].clear();
    }
    return 0;
}
*/

2018宁夏邀请赛G(DFS,动态规划【VECTOR<PAIR>】)的更多相关文章

  1. 2018宁夏邀请赛 L Continuous Intervals(单调栈+线段树)

    2018宁夏邀请赛 L Continuous Intervals(单调栈+线段树) 传送门:https://nanti.jisuanke.com/t/41296 题意: 给一个数列A 问在数列A中有多 ...

  2. “2018宁夏邀请赛 ” 兼 “The 2019 Asia Yinchuan First Round Online Programming”

    ------------7题弟弟,被各位半小时13题的大佬打惨了(滑稽)---------- 签到题就不写了. F :Moving On            (1247ms) 题意:给定大小为N的带 ...

  3. 2018宁夏邀请赛网赛 I. Reversion Count(java练习题)

    题目链接 :https://nanti.jisuanke.com/t/26217 Description: There is a positive integer X, X's reversion c ...

  4. [ICPC 2018 宁夏邀请赛] A-Maximum Element In A Stack(思维)

    >传送门< 前言 辣鸡网络赛,虽然我是个菜鸡,然而好几个队伍十几分钟就AK???我心态那会彻底崩了,后来群里炸了,话题直接上知乎热搜,都是2018ICPC宁夏网络赛原题,这怎么玩,拼手速? ...

  5. 2018宁夏邀请赛L Continuous Intervals

    题目链接:https://nanti.jisuanke.com/t/28412 题意: 给出n个数的序列.问序列中有多少个区间满足,排序完之后任意两个相邻的数之差不大于1. 题解: 用max表示区间最 ...

  6. 2018宁夏邀请赛K Vertex Covers

    题目链接:https://nanti.jisuanke.com/t/28411 题意: 给出n(n<=36)个点的一个图.求点覆盖集数. 题解: 将n个点折半为L和R两部分.对于R内部的边,枚举 ...

  7. 2018宁夏邀请赛I题 bubble sort(思维题

    https://vjudge.net/problem/Gym-102222I 居然补到个防ak,刚开始不知道啥是循环左移右移(只能移一次),不好想.. 题意:以冒泡排序为背景 给你n,k 问在1~n的 ...

  8. 2018宁夏邀请赛 Continuous Intervals(单调栈 线段树

    https://vjudge.net/problem/Gym-102222L 题意:给你n个数的序列,让判断有几个区间满足排完序后相邻两数差都不大于1. 题解:对于一个区间 [L,R],记最大值为 m ...

  9. 2018宁夏邀请赛K题Vertex Covers(高维前缀和 状压 折半

    https://vjudge.net/problem/Gym-102222K 题意:给定N点M边的无向图,每个点有点权.  点覆盖表示某个点集S{}覆盖了所有的边,其贡献是S中点权之积. 现在让你求所 ...

随机推荐

  1. Buffer类的详解(转)

    Buffer 类是 java.nio 的构造基础.一个 Buffer 对象是固定数量的数据的容器,其作用是一个存储器,或者分段运输区,在这里,数据可被存储并在之后用于检索.缓冲区可以被写满或释放.对于 ...

  2. 6 Python 数据类型—字符串

    字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串很简单,只要为变量分配一个值即可. var1 = 'Hello World!' var2 = ...

  3. python-Django监控系统二次开发Nagios

    1.Nagios安装 yum install -y nagios.i686 yum install -y nagios-plugins-all.i686 安装完后会在apache的配置文件目录下/et ...

  4. (转)Java 调用 C++ (Java 调用 dll)

    转自: http://www.cnblogs.com/baokang/p/4979243.html 因为要做点图形处理的项目,需要在Java中调用dll库,所以开发的第一步是研究了一下Java Jni ...

  5. Agc017_E Jigsaw

    传送门 题目大意 有$n$块拼图,每一块都由左中右三个部分组成,每块拼图中间部分是高为$H$的长方形,对于第$i$块品推左侧是高为$A_i$距离底部为$C_i$的长方体,右侧是高位$B_i$距底部为$ ...

  6. [冬令营模拟]GTSG2018

    上学期没有去 GTSG,于是今天老师让我们来做一下 GTSG2018 Day1 & Day3 Day1 在上午当成一场考试来搞了,Day3 由于锅太多而且 T3 玄学而被放到下午自学... 上 ...

  7. bzoj 2510: 弱题 概率期望dp+循环矩阵

    题目: Description 有M个球,一开始每个球均有一个初始标号,标号范围为1-N且为整数,标号为i的球有ai个,并保证Σai = M. 每次操作等概率取出一个球(即取出每个球的概率均为1/M) ...

  8. vue 常见的新增、编辑、查看公用同一个页面

    用vue开发经常会碰到,一个功能的新增.编辑.查看公用同一个页面,如果是页面暂且不提. 但是弹框,很多人会发现,如果是点击编辑,取消,再点新增,弹框上面是会有残留数据的,为什么会这样呢,因为在点编辑的 ...

  9. IronPython 源码剖析系列(1):IronPython 编译器

    自 IronPython 正式发布以来,由于对 Python 语言的喜爱所驱使,同时我想藉此去了解一下编程语言的编译器,分析器等程序是什么原理,如何运作的,所以我开始了对 IronPython 源代码 ...

  10. android开发 解析服务器端xml文件数据存储到android客户端SQLite数据库

    以下面xml文件为例对其解析(假设此xml就在服务器端Server项目下的servlet包下的MenuServlet文件的输出流中): <?xml version="1.0" ...