CF437C The Child and Toy
题目大意
\(n\) 个带权点,\(m\) 条无向边,删除一个点就要付出所有与之连接且没有被删除的点的点权之和的代价。
求删除所有点的最小代价。
思路
考虑点的贡献异常麻烦,我们可以把点的贡献转化为边的贡献。
对于一条边,我们有如下几点:
- 伴随着所有的点被删掉,所有的边也会被删掉;
- 一条边连接的两个结点之一被删掉时,这条边就被删掉了;
- 当一条边被删掉时,它产生的贡献是没有被删掉的结点的权值。
所以,每条边产生的贡献之和就是我们要求的答案,我们要使得这个答案最小。
那我们只需要让每条边产生的贡献最小就可以了,每次删掉的是这条边连接的两个点中权值较大的那个。
我们也可以直接按照点权排序,从大到小依次删除。
Code
#include <bits/stdc++.h>
using namespace std;
const int N = 2005000;
int n,m;
int val[N];
long long ans;
int main() {
ios::sync_with_stdio(false);
cin >> n >> m;
for(int i = 1;i <= n; i++)
cin >> val[i];
for(int i = 1,u,v;i <= m; i++) {
cin >> u >> v;
ans += min(val[u],val[v]);
}
cout << ans;
return 0;
}