第一行输入一个正整数,代表树上的节点数量。
接下来的行,每行输入两个正整数
和
,代表
号节点和
号节点有一条边相连。
一个整数,代表最小的操作次数。
3 1 2 1 3
3
第1次选择编号为2的子树。第2次选择编号为3的子树。第3次选择编号为3的子树。
n = int(input()) res = 0 for _ in range(n-1): a, b = list(map(int, input().split())) res += abs(b-a) print(res)父节点必须小于子节点,子节点a只需要在父节点b基础上再操作(a-b)次,直接把所有边的差的绝对值求和就行,被这题目的说法绕了好久。。。。。。。。。。。。。。。。。。。。。。。
#include <iostream>
#include <vector>
#include <list>
using namespace std;
struct Node {
int num{1};
list<int> child_;
Node() = default;
};
void dfs(vector<Node>& table_ ,int root, long long& result, int father_num) {
int select = root - father_num;
result += select;
table_[root].num = root;
for (int child : table_[root].child_) {
dfs(table_, child, result, root);
}
}
int main() {
int node_nums = -1;
cin >> node_nums;
vector<Node> table_(node_nums + 1);
int father, chil;
while (cin >> father >> chil) {
if (chil < father) {
std::swap(chil, father);
}
table_[father].child_.push_back(chil);
}
/////////////////////////////
long long result = 0;
dfs(table_, 1, result, 1);
cout << result << endl;
}
// 直接递归即可,根据父节点的编号,确定子节点的操作次数 /*
使用递归吧,先使用一个二维数组存储整个树。然后每次深度优先遍历整个树。对于每一个节点,
记录这个节点处要增加的次数(注意是不包括其父节点要增加的次数)。
*/
#include <iostream>
#include <vector>
using namespace std;
long long ans = 0;
void BFS(vector<vector<int>>& leftNodes, vector<int>& nodesValue, int node, int target, int last_target) {
nodesValue[node] = node;
for(int i = 0; i < leftNodes[node].size(); ++i) {
int Newnode = leftNodes[node][i];
int Newtarget = Newnode - (nodesValue[Newnode] + target);
BFS(leftNodes, nodesValue, Newnode, target + Newtarget, target);
}
ans += (target - last_target);
}
int main() {
int n;
cin>>n;
vector<vector<int>> leftNodes(n+1);
vector<int> nodesValue(n+1, 1);
for(int i = 0; i < n-1; ++i) {
int u, v;
cin>>u>>v;
if(u > v) swap(u, v);
leftNodes[u].emplace_back(v);
}
for(int i = 2; i <= n; ++i) {
int target = i - nodesValue[i];
if(target == 0) continue;
BFS(leftNodes, nodesValue, i, target, 0);
}
cout << ans;
return 0;
}
// 64 位输出请用 printf("%lld") 没绕过来,暴力递归过了
import sys
sys.setrecursionlimit(100000000)
n = int(input())
mp = [[] for _ in range(n + 1)]
for _ in range(n - 1):
u, v = map(int, input().split())
if u > v:
u, v = v, u
mp[u].append(v)
def dfs(i: int, pre: int) -> int:
ans = i - (pre)
for nxt in mp[i]:
ans += dfs(nxt, i)
return ans
print(dfs(1,1))