图论算法(四)--最小生成树的Kruskal [ 加边 ] 、Prim [ 加点 ] 的解法(JAVA)

之前我们介绍了求最短路径算法,现在又讲最小生成树算法,这两个算法有什么区别呢?

首先要明确,最短路径和最小生成树是两个不同的概念
最短路径是对于一个图的两个结点而言的。在一个图中,结点A通过某些结点和边可以走到结点B,这些结点和边组成的从A到B的路径中,最短路径就这些路径中权值总和最小的那一条(或多条)。
最短路径常用算法有:FloydDijkstra、SPFA、A*等

最小生成树是对于一个图本身而言的。对于一个有n个结点的无向连通图,必然可以去掉某些边,使得最终剩下n-1条边,与n个结点共同组成原图的一个生成树,而最小生成树就是所有可能的生成树中n-1条边的权值总和最小的那一个(或多个)。
常用算法有:KruskalPrim


我们现在在1号位置,我们要走遍图中的所有顶点,各条路上的数值即为权值,求这个过程中的最小权值是多少?

city

Input:
6 9
2 4 11
3 5 13
4 6 3
5 6 4
2 3 6
4 5 7
1 2 1
3 4 9
1 3 2
Output:
19

Kruskal

又称 “加边法”
适用于稀疏图
时间复杂度:O(MlogN),但通常边M的数目要比顶点N的数目多很多,所以最终时间复杂度为O(MlogM)

import java.util.Scanner;

class edge {
    int u, v, w;
    edge(int u, int v, int w) {
        this.u = u;
        this.v = v;
        this.w = w;
    }
}
public class Kruskal {
   
    static edge[] e = new edge[10];
    static int n, m;
    static int[] f = new int[7];
    static int sum = 0;
    static int count = 0;
    static Scanner input = new Scanner(System.in);

    public static void main(String[] args) {
        n = input.nextInt();
        m = input.nextInt();
        for (int i = 1; i <= m; i++) {
            int a = input.nextInt();
            int b = input.nextInt();
            int c = input.nextInt();
            e[i] = new edge(a, b, c);
        }
        /**
         * 按权值排序
         * */
        quicksort(e, 1, m);
        for (int i = 1; i <= n; i++) {
            f[i]  = i;
        }
        kruskal();

        System.out.println(sum);
    }

    private static void kruskal() {
        /**
         * 从小到大枚举每一条边
         * */
        for (int i = 1; i <= m; i++) {
            /**
             * 检查一条边的两个顶点是否已经连通,即判断是否在同一个集合中
             * */
            if (merge(e[i].u, e[i].v)) {
                count++;
                sum = sum + e[i].w;
            }
            /**
             * 选到n-1边之后,退出循环
             * */
            if (count == n - 1) {
                break<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值