1. 程式人生 > >csp201412_4(最優灌溉)(Java100分)

csp201412_4(最優灌溉)(Java100分)

問題描述
  雷雷承包了很多片麥田,為了灌溉這些麥田,雷雷在第一個麥田挖了一口很深的水井,所有的麥田都從這口井來引水灌溉。
  為了灌溉,雷雷需要建立一些水渠,以連線水井和麥田,雷雷也可以利用部分麥田作為“中轉站”,利用水渠連線不同的麥田,這樣只要一片麥田能被灌溉,則與其連線的麥田也能被灌溉。
  現在雷雷知道哪些麥田之間可以建設水渠和建設每個水渠所需要的費用(注意不是所有麥田之間都可以建立水渠)。請問灌溉所有麥田最少需要多少費用來修建水渠。
輸入格式
  輸入的第一行包含兩個正整數n, m,分別表示麥田的片數和雷雷可以建立的水渠的數量。麥田使用1, 2, 3, ……依次標號。
  接下來m行,每行包含三個整數ai, bi, ci,表示第ai片麥田與第bi片麥田之間可以建立一條水渠,所需要的費用為ci。
輸出格式


  輸出一行,包含一個整數,表示灌溉所有麥田所需要的最小費用。
樣例輸入
4 4
1 2 1
2 3 4
2 4 2
3 4 3
樣例輸出
6
樣例說明
  建立以下三條水渠:麥田1與麥田2、麥田2與麥田4、麥田4與麥田3。
評測用例規模與約定
  前20%的評測用例滿足:n≤5。
  前40%的評測用例滿足:n≤20。
  前60%的評測用例滿足:n≤100。
  所有評測用例都滿足:1≤n≤1000,1≤m≤100,000,1≤ci≤10,000。


思路:這個 題是最簡單的關於最小生成樹的題,我用的是prim演算法(即每次找最短邊,判斷是否聯通) 判斷是否聯通用了並查集

很基礎的最小生成樹,自行百度吧。我就不詳解了。


import java.util.PriorityQueue;
import java.util.Scanner;

public class Main{
    static int pre[];

    static boolean isLinked(int a, int b) {
        int xx = find(a);
        int yy = find(b);
        if (xx == yy) {
            return true;
        } else {
            return false;
        }
    }

    static
void Link(int a, int b) { int xx = find(a); int yy = find(b); if (xx > yy) { pre[xx] = yy; } else { pre[yy] = xx; } } static int find(int x) { if (x == pre[x]) { return x; } else { return find(pre[x]); } } public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); pre = new int[n + 1]; for (int i = 0; i < pre.length; i++) { pre[i] = i; } PriorityQueue<Canal> queue = new PriorityQueue<Canal>(); for (int i = 0; i < m; i++) { queue.add(new Canal(sc.nextInt(), sc.nextInt(), sc.nextInt())); } int result = 0; while (!queue.isEmpty()) { Canal c = queue.poll(); if (!isLinked(c.start, c.end)) { Link(c.start, c.end); result += c.price; } } System.out.println(result); } } class Canal implements Comparable<Canal> {// 水渠 int start; int end; int price; public Canal(int start, int end, int price) { super(); this.start = start; this.end = end; this.price = price; } @Override public String toString() { return "Canal [start=" + start + ", end=" + end + ", price=" + price + "]"; } @Override public int compareTo(Canal o) { // TODO Auto-generated method stub return price - o.price; } }

歡迎指正!!!