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

相关推荐
逆境不可逃21 分钟前
一篇速通互联网架构的不断升级过程:从单机到云原生
java·elasticsearch·搜索引擎·云原生·架构
YUDAMENGNIUBI2 小时前
day20_逻辑回归
算法·机器学习·逻辑回归
scott.cgi2 小时前
Unity直接编译Java文件作为插件,导致失败的两个打包设置
java·unity·unity调用java·unity的java文件·unity的android插件·unity调用android·unity加载java代码
澈2076 小时前
C++并查集:高效解决连通性问题
java·c++·算法
旖-旎8 小时前
深搜练习(单词搜索)(12)
c++·算法·深度优先·力扣
2401_873479408 小时前
运营活动被薅羊毛怎么防?用IP查询+设备指纹联动封堵漏洞
java·网络·tcp/ip·github
ShiJiuD6668889998 小时前
大事件板块一
java
摇滚侠8 小时前
@Autowired 和 @Resource 的区别
java·开发语言
SeaTunnel8 小时前
(八)收官篇 | 数据平台最后一公里:数据集成开发设计与上线治理实战
java·大数据·开发语言·白鲸开源
企客宝CRM9 小时前
2026年中小企业CRM选型指南:企客宝CRM处于什么位置?
android·算法·企业微信·rxjava·crm