本蒟蒻又卡题了!!

努力理解

4 个赞

我身为初二语文没上过90的天才,理解能力不太好

4 个赞

哦,节点i写成了节点u,然后答案的话得从深度小到大算(因为是 1 开始的)

5 个赞

嗯,有V或q吗

3 个赞

QQ3377268867

6 个赞

你们讨论去吧
到时候解决方案一人一半

4 个赞

怎么一人一半

3 个赞

不要出现金钱相关讨论。

6 个赞

不用
你可以解决方案给他
给我点赞就行

4 个赞

嗯.

3 个赞

其实这题数据 n=100 直接算深度就可以,这个换根dp作为拓展解法罢。

5 个赞

o,我试试

3 个赞

不会就别说话

6 个赞

说方yc和贾zz的天才

3 个赞
void bfs(int x)
{
	queue<node>q;
	q.push({x,0});
	while(!q.empty())
	{
		node now=q.front();
		q.pop();
		for(int i=0;i<p[now.x].size();++i)
		if(!vis[p[now.x][i]])
		{
			vis[p[now.x][i]]=1;
			s+=(now.ans+1)*a[p[now.x][i]];//累加距离
			q.push({p[now.x][i],now.ans+1});
		}
	}
}

给你搜索部分代码
只需要把所有x试一遍求最小值就行

4 个赞

我在努力

3 个赞
#include <iostream>
#include <vector>
#include <cstring>
#include <climits>
using namespace std;


const int N = 105;
vector<int> a[N];
int w[N];
int sum[N];
int tot;
int minn = INT_MAX;

void dfs(int u, int parent) {
	sum[u] = w[u]; 
	for (int v : a[u]) {
		if (v == parent) continue; 
		dfs(v, u);

		sum[u] += sum[v];
	}
}

void f(int u, int parent) {

	int r = tot - sum[u];

	int l = 0;
	for (int v : a[u]) {
		if (v != parent) {

			l += sum[v];
		}
	}

	minn = min(minn, l);

	for (int v : a[u]) {
		if (v != parent) {
			f(v, u);
		}
	}
}

int main() {
	int n;
	cin >> n; 
	for (int i = 1; i <= n; ++i) {
		cin >> w[i];
		tot += w[i]; 
	}

	for (int i = 1; i < n; ++i) {
		int u, v;
		cin >> u >> v;
		a[u].push_back(v);
		a[v].push_back(u);
	}

	dfs(1, -1);

	f(1, -1);

	cout << minn << endl;

	return 0;
}
努力了
3 个赞

至少有10分

2 个赞

我帮你改一下。

4 个赞

谢啦

3 个赞