记录编号 |
590953 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HAOI 2015]树上染色 |
最终得分 |
100 |
用户昵称 |
袁书杰 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.531 s |
提交时间 |
2024-07-13 21:58:36 |
内存使用 |
34.10 MiB |
显示代码纯文本
- #include<bits/stdc++.h>
- using namespace std;
- long long n,k,etot,head[2005],w[2005],size[2005],dp[2005][2005];
- struct Edge {
- long long u,v,w,nxt;
- } e[4005];
- void adde(long long u,long long v,long long w) {
- e[++etot] = (Edge) {u,v,w,head[u]},head[u] = etot;
- }
- void dfs(long long u,long long fa) {
- size[u]=1;
- dp[u][0]=dp[u][1]=0;
- for (long long i = head[u]; i; i = e[i].nxt) {
- long long v = e[i].v;
- if(v==fa) {
- continue;
- }
- dfs(v,u);
- size[u]+=size[v];
- for(long long j=min(k,size[u]); j>=0; j--) {
- if(dp[u][j]==-1e18) {
- for(long long k1=min(j,size[v]); k1>0; k1--) {
- if(dp[u][j-k1]!=-1e18) {
- long long tot=(k1*(k-k1)+(size[v]-k1)*(n-k-size[v]+k1))*e[i].w;
- dp[u][j]=max(dp[u][j],dp[v][k1]+dp[u][j-k1]+tot);
- }
- }
- } else {
- dp[u][j]+=(size[v]*e[i].w*(n-k-size[v])+dp[v][0]);
- for(long long k1=min(j,size[v]); k1>0; k1--) {
- if(dp[u][j-k1]!=-1e18) {
- long long tot=(k1*(k-k1)+(size[v]-k1)*(n-k-size[v]+k1))*e[i].w;
- dp[u][j]=max(dp[u][j],dp[v][k1]+dp[u][j-k1]+tot);
- }
- }
- }
- }
- }
- }
- int main() {
- freopen("haoi2015_t1.in","r",stdin);
- freopen("haoi2015_t1.out","w",stdout);
- ios::sync_with_stdio(false);
- cin.tie(0),cout.tie(0);
- cin>>n>>k;
- if(n-k<k) {
- k=n-k;
- }
- for(long long i=1; i<=2000; i++) {
- for(long long j=1; j<=2000; j++) {
- dp[i][j]=-1e18;
- }
- }
- for(long long i=1; i<=n-1; i++) {
- long long u,v,w;
- cin>>u>>v>>w;
- adde(u,v,w);
- adde(v,u,w);
- }
- dfs(1,0);
- cout<<dp[1][k];
- return 0;
- }