bzoj 2563 阿狸和桃子的游戏
在既有边权限制且又有点权限制的情况下,一般是将边权变为等效点权,或者将点权变为等效边权
在这道题中,相当于把边权的一半分别放到相邻两个点的点权上,这样对于两个不属于同一集合的点相减后会删除掉这条边的贡献,而属于同一集合的两个点会累计出这条边的贡献
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N = 10000 + 10; 5 int n, m, w[N]; 6 7 int main() { 8 scanf("%d%d", &n, &m); 9 for(int i = 1 ; i <= n ; ++ i) scanf("%d", &w[i]), w[i] *= 2; 10 for(int i = 1, u, v, x ; i <= m ; ++ i) scanf("%d%d%d", &u, &v, &x), w[u] += x, w[v] += x; 11 ll s1 = 0, s2 = 0; 12 sort(w + 1, w + 1 + n); 13 while(n) s1 += w[n --], s2 += w[n --]; 14 printf("%lld\n", (s1 - s2) / 2); 15 }