有一个小问题
查看原帖
有一个小问题
1001524
UniqueYou楼主2023/8/15 22:42
for (int i = 0; i < e[u].size(); i++)

和

for (auto &o:e[u])

有什么不同吗?//啊颓废了,再该就一模一样了……

我的

using namespace std;
int n, m, k, s, t, size[2005];
long long f[2005][2005], g[2005];
struct Edge
{
    int v;
    long long w;
};
vector<Edge> e[2005];
void dfs(int u, int fa)
{
	f[u][0] = f[u][1]=0;
	size[u] = 1;
	
	for (int i = 0; i < e[u].size(); i++){
		int v = e[u][i].v;
		if (v==fa) continue;
		dfs(v,u);
		for (int i = size[u]; i >= 0; i--)
			for (int j = size[v]; j >= 0; j--)
				f[u][i+j] = max(f[u][i+j], f[u][i] + f[v][j] + e[u][i].w*(j*(m-j)+(size[v]-j)*(n-m-size[v]+j)));
		size[u] += size[v];
	}
}
int main()
{
    cin >> n >> m;
    for (int i = 1; i < n; i++)
    {
		cin >> s >> t >> k;
		e[s].push_back({t, k});
		e[t].push_back({s, k});	
	}
	dfs(1,0);
	cout << f[1][m];
    return 0;
}

老师的

#define ull unsigned long long
#define ll long long
using namespace std;
const int N=2005;
int n,m,k,s,t,size[N];
ll f[N][N],g[N];
vector<pair<int,ll>> e[N];
void dfs(int u,int fa){
	f[u][0]=f[u][1]=0;
	size[u]=1;
	for (auto &o:e[u]){
		int v=o.first;
		if (v==fa) continue;
		dfs(v,u);
		for (int i=size[u];i>=0;--i)
			for (int j=size[v];j>=0;--j)//因为j会取到0,所以j也需要倒序枚举 
				f[u][i+j]=max(f[u][i+j],f[u][i]+f[v][j]+o.second*(j*(m-j)+(size[v]-j)*(n-m-size[v]+j)));
		size[u]+=size[v];
	}
}
int main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); 
    cin>>n>>m;
    for (int i=1;i<n;++i){
		cin>>s>>t>>k;
		e[s].push_back({t,k});
		e[t].push_back({s,k});	
	}
	dfs(1,0);
	cout<<f[1][m];
}

2023/8/15 22:42
加载中...