1. 程式人生 > >CodeForces - 893C Rumor【並查集】

CodeForces - 893C Rumor【並查集】

ret problem force net blank code stdlib.h min strong

題目鏈接:https://vjudge.net/problem/CodeForces-893C

題目大意:

有n個人,其中有m對朋友,現在你有一個秘密你想告訴所有人,第i個人願意出價a[i]買你的秘密,獲得秘密的人會免費告訴它的所有朋友(他朋友的朋友也會免費知道),現在他們想出最少的價錢買秘密,那麽你最少能得到多少錢?

#include <stdio.h>                  
#include <math.h>
#include <stdlib.h>
#define min(a,b)    (a>b?b:a)
int pre[100005
]; int find(int x) { int r = x; while (pre[r] != r) r = pre[r]; int i = x; int j; while (pre[i] != r) { j = pre[i]; pre[i] = r; i = j; } return r; } void join(int a, int b) { int f1=find(a); //超時的錯誤就出現在這,我寫成pre[a]了 int f2=find(b);
if (f1 != f2) { pre[f2] = f1; } } int main() { int n, m, i, j,a,b; long long g[100005],sum; while (scanf("%d%d", &n, &m) != EOF) { for (i = 1; i <=n; i++) { scanf("%lld", &g[i]); } for (i = 1; i <= n; i++) { pre[i]
= i; } for (i = 0; i < m; i++) { scanf("%d%d", &a, &b); join(a, b); } for (i = 1; i <= n; i++) { g[find(i)] = min(g[i], g[find(i)]); } sum = 0; for (i = 1; i <= n; i++) { if (pre[i] == i)sum += g[i]; } printf("%lld\n", sum); } return 0; }

2018-04-02

CodeForces - 893C Rumor【並查集】