zoukankan      html  css  js  c++  java
  • HDU4003

    题目大意

    给定一棵n个结点的树,每条边有一个花费,有k个机器人从点s出发,让它们遍历所有的边,最小花费是多少?

    题解

    完全没思路。。。。看了他的题解再写的~~

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    #define MAXN 10005
    struct node
    {
        int v,next,w;
    };
    node edge[2*MAXN];
    int n,s,cnt;
    int dp[MAXN][15],head[MAXN];
    bool visit[MAXN];
    void add_edge(int u,int v,int w,int &k)
    {
        edge[k].v=v;
        edge[k].w=w;
        edge[k].next=head[u];
        head[u]=k++;
    }
    void dfs(int u)
    {
        visit[u]=true;
        for(int i=head[u]; i!=-1; i=edge[i].next)
        {
            int v=edge[i].v;
            int w=edge[i].w;
            if(visit[v]) continue;
            dfs(v);
            for(int j=cnt; j>=1; j--)
                for(int k=1; k<=j; k++)
                    dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]+2*w-k*w);
        }
    }
    int main()
    {
        while(scanf("%d%d%d",&n,&s,&cnt)!=EOF)
        {
            memset(dp,0,sizeof(dp));
            memset(head,-1,sizeof(head));
            memset(visit,false,sizeof(visit));
            int sum=0,k=1;
            for(int i=1; i<n; i++)
            {
                int u,v,w;
                scanf("%d%d%d",&u,&v,&w);
                sum+=w;
                add_edge(u,v,w,k);
                add_edge(v,u,w,k);
            }
            dfs(s);
            printf("%d
    ",2*sum-dp[s][cnt]);
        }
        return 0;
    }
  • 相关阅读:
    2C Numerical Sequence (hard version)
    2A Subset——折半枚举+二分
    假设检验、Z检验与T检验
    使用PyCaret构建机器学习模型
    Python图像处理
    NumPy教程
    NLP中的标识化
    概率论的数学基础
    用直方图和箱线图理解数据
    神经网络简易教程
  • 原文地址:https://www.cnblogs.com/zjbztianya/p/3427929.html
Copyright © 2011-2022 走看看