题意:给你一棵树,树的边有边权,然后把点分为几个部分,然后这个部分与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();
}
}