• 859. Kruskal算法求最小生成树(模板)


    给定一个n个点m条边的无向图,图中可能存在重边和自环,边权可能为负数。

    求最小生成树的树边权重之和,如果最小生成树不存在则输出impossible。

    给定一张边带权的无向图G=(V, E),其中V表示图中点的集合,E表示图中边的集合,n=|V|,m=|E|。

    由V中的全部n个顶点和E中n-1条边构成的无向连通子图被称为G的一棵生成树,其中边的权值之和最小的生成树被称为无向图G的最小生成树。

    输入格式

    第一行包含两个整数n和m。

    接下来m行,每行包含三个整数u,v,w,表示点u和点v之间存在一条权值为w的边。

    输出格式

    共一行,若存在最小生成树,则输出一个整数,表示最小生成树的树边权重之和,如果最小生成树不存在则输出impossible。

    数据范围

    1n1051≤n≤105,
    1m21051≤m≤2∗105,
    图中涉及边的边权的绝对值均不超过1000。

    输入样例:

    4 5
    1 2 1
    1 3 2
    1 4 3
    2 3 2
    3 4 4
    

    输出样例:

    6

    代码:
    //思路:先把所有边按照权值从小到大排序
    //枚举每条边a,b和权重w,
    //如果a,b不连通,则将这条边加入到集合中
    
    import java.util.Arrays;
    import java.util.Scanner;
    
    class Node implements Comparable<Node>{
          int a;
          int b;
          int w;
          public Node(int a,int b,int w){
                  this.a=a;
                  this.b=b;
                  this.w=w;
          }
          @Override
          public int compareTo(Node o) {
              return this.w-o.w;
          }
    }
     public class Main{
             static final int N=100005;
             static int p[]=new int[N];
             static Node node[]=new Node[2*N];
             static int n,m;
             static int find(int x){
                     if(p[x]!=x) p[x]=find(p[x]);
                     return p[x];
             }
             public static void main(String[] args) {
                     Scanner scan=new Scanner(System.in);
                     n=scan.nextInt();
                     m=scan.nextInt();
                     for(int i=0;i<m;i++){
                             int a=scan.nextInt();
                             int b=scan.nextInt();
                             int w=scan.nextInt();
                             node[i]=new Node(a,b,w);
                     }
                     Arrays.sort(node,0,m);
                     for(int i=1;i<=n;i++) p[i]=i;
                     int res=0,cnt=0;
                     for(int i=0;i<m;i++){
                             int a=node[i].a;
                             int b=node[i].b;
                             if(find(a)!=find(b)){
                                     res+=node[i].w;
                                     cnt++;
                                     p[find(a)]=b;
                             }
                     }
                     //n个点由n-1条边连着
                     if(cnt!=n-1) System.out.println("impossible");
                     else System.out.println(res);
            }
     }
  • 相关阅读:
    Google analytics平均页面停留时间为何是0
    用易语言拦截窗口消息(带例程)
    OS + Linux RHEL / RedHat Enterprise 5 / 6 / 6.3
    Oracle学习教程:动态SQL与游标详解
    图解Oracle数据库(二)
    Oracle数据库中listener.ora sqlnet.ora tnsnames.ora的区别
    正确理解javascript的this关键字
    深入理解Javascript之this关键字
    Oracle中动态SQL详解
    oracle维护常用SQL语句(查看系统表和视图)
  • 原文地址:https://www.cnblogs.com/qdu-lkc/p/12255545.html
Copyright © 2020-2023  润新知