努力理解
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 个赞