大体一模一样,只是换个存图的方法,链式前向星是55,连接表是100,为啥阿?
(题解第四个的)
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int N=110;
int n,m;
int f[N][N];
int head[N],to[N],nxt[N],tot,val[N];
int v[N];
// vector<int> vec[N];
// int val[N][N];
void add(int x,int y,int z){
to[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
val[tot]=z;
}
void dfs(int x){
v[x]=1;
for(int i=head[x];i!=0;i=nxt[i])
// for(int i=0;i<vec[x].size();i++)
{
// int y=vec[x][i],w=val[x][y];
int y=to[i];int w=val[i];
if(v[y]) continue;
v[y]=1;
dfs(y);
for(int j=m;j>=1;j--){
for(int k=j-1;k>=0;k--){
f[x][j]=max(f[x][j],w+f[y][k]+f[x][j-k-1]);
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
// vec[x].push_back(y);
// vec[y].push_back(x);
// val[x][y]=z;
// val[y][x]=z;
}
dfs(1);
printf("%d",f[1][m]);
return 0;
}
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int N=110;
int n,m;
int f[N][N];
// int head[N],to[N],nxt[N],tot,val[N];
int v[N];
vector<int> vec[N];
int val[N][N];
// void add(int x,int y,int z){
// to[++tot]=y;
// nxt[tot]=head[x];
// head[x]=tot;
// val[tot]=z;
// }
void dfs(int x){
v[x]=1;
// for(int i=head[x];~i;i=nxt[i])
for(int i=0;i<vec[x].size();i++){
int y=vec[x][i],w=val[x][y];
// int y=to[i];int w=val[i];
if(v[y]) continue;
v[y]=1;
dfs(y);
for(int j=m;j>=1;j--){
for(int k=j-1;k>=0;k--){
f[x][j]=max(f[x][j],w+f[y][k]+f[x][j-k-1]);
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
// add(x,y,z);add(y,x,z);
vec[x].push_back(y);
vec[y].push_back(x);
val[x][y]=z;
val[y][x]=z;
}
dfs(1);
printf("%d",f[1][m]);
return 0;
}