Rumah > Java > javaTutorial > Bagaimana untuk melaksanakan algoritma Kruskal di Jawa

Bagaimana untuk melaksanakan algoritma Kruskal di Jawa

王林
Lepaskan: 2023-05-11 22:19:04
ke hadapan
825 orang telah melayarinya

Pengenalan

Terdapat satu lagi algoritma untuk membina pokok rentang minimum, algoritma Kruskal: Biarkan graf G = (V, E) ialah graf wajaran bersambung tidak berarah, V = {1, 2,. .. n}; Katakan pokok rentang minimum T = (V, TE Keadaan awal pokok itu hanya mempunyai n nod dan graf tidak bersambung tanpa tepi T = (V, {}). n nod sebagai n dahan bersambung terpencil. Ia mula-mula mengisih semua tepi mengikut beratnya dari kecil ke besar, dan kemudian jika bilangan tepi untuk dipilih dalam T kurang daripada n-1, ia membuat pemilihan tamak seperti ini: pilih tepi (i, j) dengan berat terkecil dalam set tepi E ), jika menambah tepi (i, j) pada set TE tidak menghasilkan kitaran, maka tambah tepi (i, j) pada set tepi TE, iaitu, gunakan tepi (i , j) untuk menggabungkan dua cawangan ke dalam cawangan yang disambungkan ; Padamkan tepi (i, j) daripada set E dan teruskan pemilihan tamak di atas sehingga semua nod dalam T berada pada cawangan bersambung yang sama. Pada masa ini, tepi n-1 yang dipilih betul-betul membentuk pokok rentang minimum T graf G.

Algoritma Kruskal menggunakan kaedah yang sangat pintar, iaitu menggunakan set untuk mengelakkan bulatan jika titik permulaan dan titik akhir tepi yang dipilih adalah kedua-duanya dalam set T, boleh disimpulkan bahawa gelung; akan terbentuk, dan kedua-dua nod yang ditukar tidak boleh dimiliki oleh koleksi yang sama.

Langkah algoritma

1 Permulaan. Isih semua tepi dalam tertib menaik berat, dan mulakan setiap nombor set nod kepada nombornya sendiri.

2 Pilih tepi (u, v) dengan berat terkecil dalam susunan yang disusun.

3 Jika nod u dan v tergolong dalam dua cabang bersambung yang berbeza, tambahkan tepi (u, v) pada set tepi TE dan cantumkan dua cabang yang bersambung.

4 Jika bilangan tepi yang dipilih kurang daripada n-1, pergi ke langkah 2, jika tidak, algoritma akan tamat.

1. Gambar rajah yang dibina

Bagaimana untuk melaksanakan algoritma Kruskal di Jawa

2. Kod

package graph.kruskal;
 
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
 
public class Kruskal {
    static final int N = 100;
    static int fa[] = new int[N];
    static int n;
    static int m;
 
    static Edge e[] = new Edge[N * N];
    static List<Edge> edgeList = new ArrayList();
 
    static {
        for (int i = 0; i < e.length; i++) {
            e[i] = new Edge();
        }
    }
 
    // 初始化集合号为自身
    static void Init(int n) {
        for (int i = 1; i <= n; i++)
            fa[i] = i;
    }
 
    // 合并
    static int Merge(int a, int b) {
        int p = fa[a];
        int q = fa[b];
        if (p == q) return 0;
        for (int i = 1; i <= n; i++) { // 检查所有结点,把集合号是 q 的改为 p
            if (fa[i] == q)
                fa[i] = p; // a 的集合号赋值给 b 集合号
        }
        return 1;
    }
 
    // 求最小生成树
    static int Kruskal(int n) {
        int ans = 0;
        Collections.sort(edgeList);
        for (int i = 0; i < m; i++)
            if (Merge(edgeList.get(i).u, edgeList.get(i).v) == 1) {
                ans += edgeList.get(i).w;
                n--;
                if (n == 1)//n-1次合并算法结束
                    return ans;
            }
        return 0;
    }
 
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        m = scanner.nextInt();
        Init(n);
        for (int i = 1; i <= m; i++) {
            e[i].u = scanner.nextInt();
            e[i].v = scanner.nextInt();
            e[i].w = scanner.nextInt();
            edgeList.add(e[i]);
        }
        System.out.println("最小的花费是:" + Kruskal(n));
    }
}
 
class Edge implements Comparable {
    int u;
    int w;
    int v;
 
    @Override
    public int compareTo(Object o) {
        if (this.w > ((Edge) o).w) {
            return 1;
        } else if (this.w == ((Edge) o).w) {
            return 0;
        } else {
            return -1;
        }
    }
}
Salin selepas log masuk

3. Putih adalah output.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan algoritma Kruskal di Jawa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan