我是A题 & 玛丽亚之墙 \operatorname{我是 A 题\ \&\ 玛丽亚之墙} 我是A题 & 玛丽亚之墙
题目链接: nowcoder 212004 \operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{\operatorname{nowcoder\ 212004}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} nowcoder 212004
到牛客看:
题目
众所周知,题目名称与题面没有任何关系。
你发现了一道 div2 的 A 题,下面是这道题的题面:
给定一张 n {n} n 个点, n − 1 {n-1} n−1 条边的无向联通图和一个常数 k {k} k,每个点拥有点权 w i w_i wi,每条边拥有边权 v a l i val_i vali,现在他决定保留一些边,这样将剩余部分连通块,牛牛的目标是使得每个剩余的连通块的点权和都是 k {k} k 的倍数,同时最小化被保留的边的权值和。
输入
第一行两个正整数 n , k n,k n,k
接下来一行 n n n 个正整数,第 i i i 个正整数表示节点 i i i 的权值是 w i w_i wi
接下来 n − 1 n-1 n−1 行,每行 3 3 3 个正整数,表示一条连接 u , v u,v u,v 边权为 v a l i val_i vali 的边。
输出
输出一行一个正整数最小的权值和。
样例输入1
5 2
1 0 1 1 1
1 2 5
1 4 3
2 3 2
2 5 1
样例输出1
6
样例解释1
选择 ( 1 , 4 ) , ( 2 , 3 ) , ( 2 , 5 ) (1,4),(2,3),(2,5) (1,4),(2,3),(2,5)
样例输入2
10 3
1 3 4 2 1 6 2 3 5 6
1 2 2
1 4 1
2 3 3
2 6 3
2 10 2
5 6 4
5 7 4
6 8 3
6 9 1
样例输出2
12
样例解释2
选择 ( 1 , 4 ) , ( 2 , 3 ) , ( 2 , 6 ) , ( 5 , 7 ) , ( 6 , 9 ) (1,4),(2,3),(2,6),(5,7),(6,9) (1,4),(2,3),(2,6),(5,7),(6,9)
数据范围
n
,
k
≤
1
0
6
n,k≤10^6
n,k≤106
w
i
,
v
a
l
i
≤
1
0
9
w_i,val_i≤10^9
wi,vali≤109
∑
i
=
1
n
w
i
m
o
d
k
=
0
\sum_{i=1}^nw_i\bmod k=0
∑i=1nwimodk=0
思路
这道题是一道爆搜。
因为原来就是一棵树,那我们就可以让任意一个点为根,进行 dfs 爆搜。
对于每一个子树,如果它自己已经可以单独存在,那它就没有必要与它的父亲连边。
否则,就要连边,与父亲变成新的连通块。
代码
#include<cstdio>
#include<queue>
using namespace std;
vector <int> to[1000001], size[1000001];
int n, k, x, y;
long long z, sum[1000001], ans;
void dfs(int now, int father) {
for (int i = 0; i < to[now].size(); i++)
if (father != to[now][i]) {
dfs(to[now][i], now);
sum[now] = (sum[now] + sum[to[now][i]]) % k;
if (sum[to[now][i]]) ans += size[now][i];//如果这个子树不能单独形成连通块就要连接
}
}
int main() {
scanf("%d %d", &n, &k);
for (int i = 1; i <= n; i++) {
scanf("%lld", &sum[i]);
sum[i] %= k;
}
for (int i = 1; i < n; i++) {
scanf("%d %d %lld", &x, &y, &z);
to[x].push_back(y);
size[x].push_back(z);
to[y].push_back(x);
size[y].push_back(z);
}
dfs(1, 0);
printf("%lld", ans);
return 0;
}