SW练习_P3366_最小生成树

本文深入探讨了Kruskal算法在解决最小生成树问题中的应用,详细解释了算法的实现过程,包括初始化并查集、边的优先级队列处理以及关键的并查集操作:查找、合并和判断连接性。通过具体实例展示了如何使用Kruskal算法找到加权图的最小生成树,并在不能形成连通图时输出特定信息。

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

这是一个模板题

唯一的要求就是,不能连通的话,让输出orz

package info.frady.luogu;


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class P3366 {
    static int[] set;
    static int N;
    public static void main(String[] args) throws Exception{
        BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st=new StringTokenizer(reader.readLine());
        N=Integer.parseInt(st.nextToken());// N 个结点和 M 条无向边
        set=new int[N+1];
        int M=Integer.parseInt(st.nextToken());//M 条无向边
        PriorityQueue<Edge3366> pq=new PriorityQueue<Edge3366>();
        init();
        for (int i = 0; i <M ; i++) {
            st=new StringTokenizer(reader.readLine());
            int start=Integer.parseInt(st.nextToken());
            int end=Integer.parseInt(st.nextToken());
            int dis=Integer.parseInt(st.nextToken());
            pq.add(new Edge3366(start,end,dis));
        }
        int sum=0;
        int cout=0;
        while(!pq.isEmpty()){
            Edge3366 e=pq.poll();
            if(!connected(e.start,e.end)){
                union(e.start,e.end);
                sum=sum+e.dis;
                cout++;
            }
        }
        if(cout+1<N){
            System.out.println("orz");
        }else{
            System.out.println(sum);
        }
            reader.close();
        }

        public static void init(){
            for (int i = 0; i <set.length; i++) {
                set[i]=i;
            }
        }
        public static void union(int a,int b){
            int A=find(a);
            int B=find(b);
            if(A!=B){
             set[A]=B;
            }

        }
        public static int find(int a){
            if(set[a]==a){
                return set[a];
            }
            return set[a]=find(set[a]);

        }
        public static boolean connected(int a,int b){
            int A=find(a);
            int B=find(b);
            return A==B;
        }
}
class Edge3366 implements Comparable<Edge3366>{
    int start;
    int end;
    int dis;
    public Edge3366(int start, int end, int dis) {
        this.start = start;
        this.end = end;
        this.dis = dis;
    }

    @Override
    public int compareTo(Edge3366 o) {
        return this.dis-o.dis;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值