Java 地铁修建

本文介绍了一个使用Java实现的并查集算法示例。该示例通过解决一个具体的连通性问题来展示如何利用并查集进行节点的查找与合并操作。通过对输入的数据进行排序并逐步构建连接的方式,确保了最终所有节点能够被正确地划分到不同的集合中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package test;

import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

class node {
    int x, y, z;

}

public class Main {
    static int[] p = new int[100010];
    static int n, m;
    static LinkedList<node> list = new LinkedList<node>();
    static int find(int x){
        if(p[x]==x){
            return x;//若x自己就是祖先结点,返回他自己
        }
        else{
            int y=find(p[x]);//层层递归找到x的祖先结点,并且将它作为祖先结点的子节点
            p[x]=y;
            return y;
        }
    }
    static void union_p(int x,int y){
        if(x==y){
            return ;
        }
        p[x] = y;//y成为x的父节点
    }

    public static void main(String[] args) {
        Scanner in =new Scanner(System.in);

        int x,y,z=0;
        n = in.nextInt();
        m = in.nextInt();
        for(int i=0;i<m;i++){
            node node1 = new node();
            node1.x=in.nextInt();
            node1.y=in.nextInt();
            node1.z=in.nextInt();
            list.add(node1);
        }
        Collections.sort(list, new Comparator<node>() {
            @Override
            public int compare(node n1, node n2) {
                if (n1.z >= n2.z) {
                    return 1;
                } else {
                    return -1; 
                }
            }
        });
        for(int i=1;i<=n;i++){
            p[i]=i;
        }
        int i = 0;

        for(node s:list){
            x = s.x;
            y = s.y;
            z = s.z;
            int xf = find(x);
            int yf = find(y);
            union_p(xf,yf);
            if(find(1)==find(n)){
                break;
            }

        }
        System.out.println(z);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值