题意:
有许多油井和村庄什么的,让你使得这些村庄能连通一个油井就好了。第一行给你一个数字T代表有T组测试数据,第二行有 M , N , K ,M代表包括油井在内的村庄数,N 代表有N个 两两连通的地方。K代表有K个油井。接下来有N行,每行三个数 u , v, w, 代表 u 号和 v 是连通的 权值为 w。
思路:
以往做的题目都是只有一个源点,这道题油井的数目就是源点,所以源点不唯一。但是不要想复杂啦、其实一开始直接让所有源点并在一、再求最小生成树就好了。
代码:
1 import java.util.Scanner; 2 import java.util.Comparator; 3 import java.util.Arrays; 4 import java.text.DecimalFormat; 5 6 class Node{ 7 public int u, v; 8 public int w; 9 } 10 11 class mycmp implements Comparator<Node>{ 12 public int compare(Node A, Node B){ 13 if(A.w == B.w) return 0; 14 else if(A.w < B.w) return -1; 15 else return 1; 16 } 17 } 18 19 public class Main { 20 final static int MAXN = 40000 + 13; 21 final static int INF = 0x3f3f3f3f; 22 static int[] pre = new int[MAXN]; 23 static Node[] map = new Node[MAXN]; 24 public static void main(String[] args){ 25 Scanner sc = new Scanner(System.in); 26 int T = sc.nextInt(); 27 int kas = 1; 28 while(T != 0){ 29 int N = sc.nextInt(); 30 int M = sc.nextInt(); 31 int K = sc.nextInt(); 32 int power = sc.nextInt(); 33 mst(N); 34 for(int i = 0; i < K - 1; i++){ 35 int num = sc.nextInt(); 36 pre[num] = power; 37 } 38 for(int i = 1; i <= M; i++){ 39 map[i] = new Node(); 40 map[i].u = sc.nextInt(); 41 map[i].v = sc.nextInt(); 42 map[i].w = sc.nextInt(); 43 } 44 Arrays.sort(map, 1, M + 1, new mycmp()); 45 int ans = ksu(N, M, K); 46 System.out.println("Case #" + kas + ": " + ans); 47 kas++; 48 T--; 49 } 50 sc.close(); 51 } 52 public static int ksu(int N, int M, int k){ 53 int cnt = 0; 54 int ans = 0; 55 for(int i = 1; i <= M; i++){ 56 int fu = Find(map[i].u); 57 int fv = Find(map[i].v); 58 if(fu != fv){ 59 cnt++; 60 pre[fv] = fu; 61 ans += map[i].w; 62 } 63 if(cnt == N - k){ 64 return ans; 65 } 66 } 67 return 0; 68 } 69 public static int Find(int x){ 70 return x == pre[x] ? x : (pre[x] = Find(pre[x])); 71 } 72 public static void mst(int N){ 73 for(int i = 1; i <= N; i++){ 74 pre[i] = i; 75 } 76 } 77 }