ccf歷年第四題java解答之-201412-4-最優灌溉(100分)
阿新 • • 發佈:2018-12-05
使用kruskal求解,耗時943ms,得分100
徘徊在超時的邊緣,同樣的程式碼,有時候提交是100分,有時候是超時90分,還有時候是超時80分==
import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Scanner; class Node implements Comparable<Node>{ public int p1; public int p2; public int l; public Node(int p1, int p2, int l) { this.p1 = p1; this.p2 = p2; this.l = l; } @Override public int compareTo(Node o) { return this.l - o.l; } } public class Main{ private static int[] v; public static void main(String[] args){ Scanner scanner = new Scanner(System.in); String[] firstLine= scanner.nextLine().split(" "); int n = Integer.parseInt(firstLine[0]); int m = Integer.parseInt(firstLine[1]); List<Node> nodes = new ArrayList<>(); for(int i = 0; i < m; i++){ String[] line = scanner.nextLine().split(" "); int p1 = Integer.parseInt(line[0]); int p2 = Integer.parseInt(line[1]); int l = Integer.parseInt(line[2]); nodes.add(new Node(p1, p2, l)); } scanner.close(); Collections.sort(nodes); v = new int[n + 1]; for(int i = 0; i < v.length; i++){ v[i] = i; } int len = 0; while(n > 1){ Node node = nodes.get(0); nodes.remove(node); int x = find(node.p1); int y = find(node.p2); if(x != y){ len += node.l; v[x] = y; n--; } } System.out.println(len); } private static int find(int x){ while (true){ if(v[x] == x) return x; x = v[x]; } } }