zoukankan      html  css  js  c++  java
  • Prim算法

    解决这个问题我用的是Set集合,因为Set有不加重复元素,又可以迭代其中的元素,以及知道其大小等优点。

    我们把树上的所有顶点分成2部分,已经访问的顶点称之为U,还没访问的称之为  V-U,找最小生成树的过程就是 遍历V-U中的点,使他们到U中的某个点距离最小!!

    然后再把这个点加入到U中

    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.Scanner;
    /*
     *设G=(V,E)是无相连通带权图,找出最小生成树,也就是找出权值和最小的生成树。
     *
     测试用例:
    10 6
    1 2 6 1 3 1 1 4 5
    2 5 3 2 3 5
    3 5 6 3 6 4
    3 4 5
    4 6 2
    5 6 6
     */
    import java.util.Set;
    
    public class Test {
        static int edge,node;   //边数、顶点数
        static int [][] c=new int[20][20];
        static boolean  []s=new boolean[20];  //如果s[i]=true,说明该顶点已经属于最小生成树的一部分
        static Scanner sc=new Scanner(System.in);
        static Set<Integer> set=new HashSet<Integer>();   //set表示U集合
        public static void main(String[] args) {
            int edge,node,f,t,v;
            edge=sc.nextInt();
            node=sc.nextInt();
            set.clear();
            for(int i=1;i<=node;i++){
                for(int j=1;j<=node;j++){
                    c[i][j]=10000;
                    c[j][i]=10000;
                }
                
            }
            for(int i=1;i<=edge;i++){
                f=sc.nextInt();
                t=sc.nextInt();
                v=sc.nextInt();
                c[f][t]=v;
                c[t][f]=v;
            }
            set.add(1);
            prim(node, 1);
            
        }
        
        public static void prim(int n,int u){
            s[u]=true;
            int u0,mini=1000,k=0;
            while(set.size()<n){
                Iterator<Integer> iterator = set.iterator();
                mini=1000;
                while(iterator.hasNext()){
                 u0= (int)iterator.next();
                    for(int i=1;i<=n;i++){
                        if(i!=u0&&c[i][u0]<mini&&s[i]==false){
                            mini=c[i][u0];
                            k=i;
                        }
                    }
                }
                set.add(k);
                s[k]=true;
                System.out.println(k);
            }
        }
    }
  • 相关阅读:
    类似Sina新浪滑动门代码
    纯CSS无JS实现灰色下拉导航菜单代码
    滑动门与选项卡互转的实现方法代码
    一款横向、竖向两个选项卡Tab一起联动的导航代码
    C#Brush的使用(转载)
    泛型学习笔记(转载)
    Application之间共享MasterPage(转载)
    ReportView学习笔记一(转载)
    BackGroundWorker学习
    加下划线的TextBox
  • 原文地址:https://www.cnblogs.com/wintersong/p/5034357.html
Copyright © 2011-2022 走看看