Educational Codeforces Round 33 C.Rumor
题意:
小明想要给这n个人传递假信息,小明给第 i 个人传递信息的费用为 c[i] ,存在m对人之间可以相互传递信息且费用为0 。求最小信息费
思路:
并查集,然后查找每棵树中的最小费用点
import java.math.*;
import java.util.Arrays;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
import java.util.logging.LoggingMXBean;
public class Main {
final static int inf = 0x3f3f3f3f;
static int[] c = new int[100010];
static int[] pre = new int[100010];
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
int m = cin.nextInt();
for(int i=1;i<=n;i++)
{
pre[i] = i;
c[i] = cin.nextInt();
}
if(m==0) //不存在关系
{
long sum = 0;
for(int i=1;i<=n;i++)
sum += c[i];
System.out.println(sum);
}
else
{
for(int i=0;i<m;i++)
{
int x = cin.nextInt();
int y = cin.nextInt();
join(x,y);
}
for(int i=1;i<=n;i++)
{
c[find(i)] = Math.min(c[i],c[find(i)]);
}
long sum = 0;
for(int i=1;i<=n;i++)
{
if(pre[i]==i)
sum += c[i];
}
System.out.println(sum);
}
}
public static int find(int x)
{
if(pre[x]==x)
return x;
else
{
return pre[x] = find(pre[x]);
}
}
public static void join(int x,int y)
{
x = find(x);
y = find(y);
if(x!=y)
pre[y] = x;
}
}