Java中的图论2——Kruskal算法

Java中的Kruskal------最小生成树

  • [Kruskal ------ 最小生成树/图](#Kruskal —— 最小生成树/图)
  • [例题1(FROM 洛谷 P3366)](#例题1(FROM 洛谷 P3366))

图论的第一篇是前一章的 -> Java中的 Dijkstra 算法,还打算写一个Floyd,在图论的最后一章会总结三种算法在什么情况下适合使用,以及使用方法,加深记忆。

Kruskal ------ 最小生成树/图

学过离散数学的应该知道什么是最小生成树/图,假设有n个节点,画n-1条边使得该树/图最后的总权重最小的,就是最小生成。Kruskal 算法其实是图论思想和并查集 的结合。并查集不会的可以去补一下 ->Java中的并查集

例题1(FROM 洛谷 P3366)


这就是个模板题,没有什么思路,可以直接看代码

代码实现

java 复制代码
import java.util.*;
import java.io.*;

public class Main{
    static int [] p;
    static BufferedReader bf  = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer st;
    
    public static void main(String [] args) throws IOException{
        int n = Integer.parseInt(next());
        int m = Integer.parseInt(next());
        int [][] e = new int [m][3];//{u,v,w};
        for(int i=0;i<m;i++){
            int u = Integer.parseInt(next());
            int v = Integer.parseInt(next());
            int w = Integer.parseInt(next());
            e[i] = new int []{u,v,w};
        }
        Arrays.sort(e,(a,b)->a[2]-b[2]);//将接收到的边按照权重从小到大排序
        
        p = new int [n+1];
        for(int i=1;i<=n;i++)
            p[i] = i;
            
        long ans = 0;//结果
        int count  = 0;//边的个数
        for(int [] E:e){
            int u = E[0];
            int v = E[1];
            int w = E[2];
            if(find(u) != find(v)){//如果没在最小生成图里
                union(u,v);//加进去
                ans += w;//结果加上该边的权重
                count++;//边数加一
                if(count == n-1) break;//如果已经找到了n-1条边,提前结束,剪枝
            }
        }
        if(count < n-1)//如果找到的边不够,说明该图不连通
            System.out.print("orz");
        else System.out.print(ans);
    }
    static int find(int x){
        if(x == p[x]) return x;
        else return p[x] = find(p[x]);
    }
    static void union(int x,int y){
        int rx = find(x);
        int ry = find(y);
        if(rx != ry)
            p[rx] = ry;
    }
    static String next() throws IOException{
        while(st == null || !st.hasMoreTokens()){
            String str = bf.readLine();
            if(str == null) return null;
            st = new StringTokenizer(str);
        }
        return st.nextToken();
    }
}

进阶版: 洛谷 P2820,自行练习吧,代码我贴这里了:

java 复制代码
import java.util.*;
public class Main{
    static int [] p;
    public static void main(String [] args){
        Scanner input = new Scanner (System.in);
        int n = input.nextInt();
        int k = input.nextInt();
        int [][] f = new int [k][3];
        long sumM = 0;
        for(int i=0;i<k;i++){
            f[i][0] = input.nextInt();//i
            f[i][1] = input.nextInt();//j
            f[i][2] = input.nextInt();//m
            sumM += f[i][2];
        }
        Arrays.sort(f,(a,b)->a[2]-b[2]);
        p = new int [n+1];
        for(int i=0;i<=n;i++)
            p[i] = i;
        
        long ans = 0;
        int count = 0;
        for(int i=0;i<k;i++){
            int u = f[i][0];
            int v = f[i][1];
            int w = f[i][2];
            if(find(u) != find(v)){
                union(u,v);
                ans += w;
                count ++;
                if(count == n-1) break;
            }
        }
        System.out.print(sumM-ans);
    }
    static int find(int x){
        if(x == p[x]) return x;
        else  return p[x] = find(p[x]);
    }
    static void union(int x,int y){
        int rx = find(x);
        int ry = find(y);
        if(rx != ry)
            p[rx] = ry;
    }
}

只要学好并查集 so easy

相关推荐
Mikko74 分钟前
用 Java 复刻了高中时在塞班上玩的「熔岩矿车」:纯 Swing、零依赖、没有一张图片,一个 jar 双击就能玩
java·游戏开发·swing
知了学历孙老师5 分钟前
小自考的校考和统考,出题方和难度差在哪
java·大数据·前端
Java爱好狂.24 分钟前
Java初学者如何一周速通SpringBoot!
java·spring boot·后端·spring·高并发·架构师·java面试
秋饼1 小时前
LLM API密钥动态轮换实战:Spring Vault + Spring AI + 多Provider路由
java·ai·技术分享·后端开发
福兮说3 小时前
JSON 格式正确,数据就可靠吗?我用一份自编配置检查类型与空值
java·前端·json
罗西的思考3 小时前
【Agentic RL】Dressage Staleness 控制深度分析
人工智能·算法·机器学习
quaer3 小时前
弗洛伊德算法--判圈法寻找环的入口O(n) O(1)
数据结构·算法
紧跟先前的步伐4 小时前
Go AI Agent 实战 03|Token、上下文窗口与模型调用成本
java·人工智能·golang
高晶4 小时前
无乘法器实现LC二阶滤波器:基于移位运算的快速算法与四种精度推导
算法·设计模式·程序员
ysbfsy5 小时前
大数计算思路
算法