2017第三次多校联合hdu6060

来源:互联网 发布:java替换\ 编辑:程序博客网 时间:2024/06/05 15:56

题目

题意:给你一棵树,树的边有边权,然后把点分为几个部分,然后这个部分与1相连,问如何分最后的最小斯坦纳树值最大。

题意:好像不需要最小斯坦纳树的什么东西。。。
分法:对于一个点来说,把他分成min(与他相连的边数,给定的部分数)。然后乘以边权累加就好了。具体看代码吧,应该挺好理解的。

#include<bits/stdc++.h>using namespace std;const int maxn=1000050;struct bbq{    int e,v;};int n,k;long long int ans=0;vector<bbq> e[maxn];bool vis[maxn];void add(int t1 , int t2 , int t3){    bbq l;     l.e=t2;      l.v=t3;    e[t1].push_back(l);}int dfs(int x){    vis[x]=1;    if(e[x].size()==1&&x!=1)        return 1;    int num=0;    for(int i=0; i<e[x].size(); i++)    {        if(vis[e[x][i].e]==1)continue;        int t=dfs(e[x][i].e);        num+=t;        ans+=(long long )t*(long long)e[x][i].v;    }    return (num+1>k)?k:(num+1);}int main(){    //freopen("data.in", "r", stdin);    while(~scanf("%d%d",&n,&k))    {        memset(vis,0,sizeof vis);        ans=0;        for(int i=1; i<n; i++)        {            int a,b,c;            scanf("%d %d %d",&a,&b,&c);            add(a,b,c);            add(b,a,c);        }        dfs(1);        printf("%lld\n",ans);        for(int i=0; i<=n; i++)            e[i].clear();    }}
原创粉丝点击