实施 Kruskal 算法时测试电路

2023-12-20

我正在尝试编写一个程序来找到最小生成树。但我在使用该算法时遇到的一个问题是测试电路。在java中执行此操作的最佳方法是什么?

好的,这是我的代码

import java.io.*;
import java.util.*;

public class JungleRoads 
{
    public static int FindMinimumCost(ArrayList graph,int size)
    {
        int total = 0;
        int [] marked = new int[size];      //keeps track over integer in the mst

        //convert an arraylist to an array
        List<String> wrapper = graph;
        String[] arrayGraph = wrapper.toArray(new String[wrapper.size()]);
        String[] temp = new String[size];
        HashMap visited = new HashMap();


        for(int i = 0; i < size; i++)
        {
           // System.out.println(arrayGraph[i]);
            temp = arrayGraph[i].split(" ");

            //loop over connections of a current node
            for(int j =  2; j < Integer.parseInt(temp[1])*2+2; j++)
            {

                if(temp[j].matches("[0-9]+"))
                {
                    System.out.println(temp[j]);
                }
            }


        }


        graph.clear();
        return total;


    }


    public static void main(String[] args) throws IOException
    {

         FileReader fin = new FileReader("jungle.in");
        BufferedReader infile = new BufferedReader(fin);

        FileWriter fout = new FileWriter("jungle.out");
        BufferedWriter outfile = new BufferedWriter(fout);


        String line;
        line = infile.readLine();
        ArrayList graph = new ArrayList();

        do
        {

            int num = Integer.parseInt(line);
            if(num!= 0)
            {

                int size = Integer.parseInt(line)-1;

                for(int i=0; i < size; i++)
                {
                    line = infile.readLine(); 
                    graph.add(line);
                }

               outfile.write(FindMinimumCost(graph, size));
            }   


            line = infile.readLine();
        }while(!line.equals("0"));

    }
}

Kruskall 算法不搜索循环,因为它的性能效率不高;相反,创建不相交的树,然后将它们连接起来。由于用一条边连接两个不同的子树会创建一棵新树,因此无需检查循环。

如果你看维基页面 http://en.wikipedia.org/wiki/Kruskal%27s_algorithm算法如下:

1. create a forest **F** (a set of trees), where each vertex in the graph is a separate tree
2. create a set S containing all the edges in the graph
3. while S is nonempty and F is not yet spanning
    a. remove an edge with minimum weight from S
    b. if that edge connects two different trees, then add it to the forest, combining 
       two trees into a single tree
    c. otherwise discard that edge.

你应该使用不相交集数据结构 http://en.wikipedia.org/wiki/Disjoint-set_data_structure为了这。再次来自维基:

首先使用 O(E log E) 中的比较排序按权重对边进行排序 时间;这允许步骤“从 S 中删除具有最小权重的边” 以恒定的时间运行。接下来,我们使用不相交集数据 结构(Union&Find)来跟踪哪些顶点位于哪个顶点 成分。我们需要执行 O(E) 操作,两个“查找”操作 每条边可能有一个并集。即使是简单的不相交集数据 诸如不相交集森林之类的按等级并集的结构可以执行 O(E log V) 时间内的 O(E) 操作。因此总时间为 O(E log E) = O(E log V)。


#创建不相交的森林 现在你可以看看Boost图库-增量组件 http://www.boost.org/doc/libs/1_49_0/libs/graph/doc/incremental_components.html部分。 你应该实现一些方法:MakeSet, Find, Union,之后就可以实现Kruskal算法了。您所做的就是使用集合,最简单的方法就是使用链表。

每组都有一个元素,名称为代表元素这是集合中的第一个元素。

1-首先实施MakeSet通过链表:

这为增量准备了不相交集数据结构 连接组件算法通过使图中的每个顶点成为 它自己的组件(或集合)的成员。

只需将每个顶点(元素)初始化为新集合的代表元素,我们可以通过将它们设置为自己的父元素来做到这一点:

 function MakeSet(x)
   x.parent := x

2-实施Find method:

查找包含顶点的集合的代表元素x:

 function Find(x)
 if x.parent == x
    return x
 else
    return Find(x.parent)

The if部分检查元素是否是代表性元素。我们通过将集合的所有代表性元素设置为它们自己的父元素来将它们设置为它们的第一个元素。

3-最后,当所有前面的步骤完成后,简单的部分是实现Union method:

function Union(x, y)
 xRoot := Find(x) // find representative element of first element(set)
 yRoot := Find(y) // find representative element of second element(set)
 xRoot.parent := yRoot // set representative element of first set 
                       // as same as representative element of second set

现在你应该如何运行 Kruskall?

首先将所有节点放入n不相交集由MakeSet方法。在找到所需边(未标记且最小的边)后的每次迭代中,通过以下方式查找其端点顶点的相关集Find方法(它们的代表元素),如果相同,则将这条边丢弃,因为这条边会导致循环,但如果它们在不同的集合中,则使用Union合并这些集合的方法。由于每个集合都是一棵树,因此它们的并集也是一棵树。

您可以通过为不相交集选择更好的数据结构来优化它,但现在我认为这已经足够了。如果您对更高级的数据结构感兴趣,您可以实现rank基本方法,在 wiki 中有一个关于它的很好的文档,它很简单,但我没有提及它以防止混淆。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实施 Kruskal 算法时测试电路 的相关文章

  • Spring Rest-API - 403 禁止错误响应

    我是 Spring 新手 我正在编写 REST API 我收到 403 删除 放置禁止错误 以下是我正在处理的示例 RequestMapping value noteId method RequestMethod PUT public Re
  • Infinispan 复制缓存不复制对象以供读取

    我们正在尝试在 Openshift 内的 Wildfly 11 上运行的两个 infinispan 节点上安装复制缓存 当我们在一个节点上写入一个对象时 它不会显示在另一节点上进行读取 启动时 节点在集群中连接 并且可以看到彼此 如日志中所
  • 使用 spring security 找不到 AuthenticationProvider

    我一直在尝试使用 x509 证书通过 LDAP 对用户进行身份验证 但似乎无法正常工作 我声明了一个身份验证提供程序 但仍然抛出错误 提示没有提供程序 这是我的调试输出 INFO Initiating Jersey application
  • 为什么Java HashMap的最大容量是1<<30而不是1<<31?

    Why is the maximum capacity of a Java HashMap 1 lt lt 30 and not 1 lt lt 31 even though the max value of an int is 231 1
  • java“类文件包含错误的类”错误

    我正在尝试制作一个控制台应用程序来测试我的网络服务 我成功部署了一个网络服务http localhost 8080 WS myWS http localhost 8080 WS myWS我用 wsimport 制作了代理类 wsimport
  • Stream#limit 返回的元素是否可以少于预期?

    如果流s下面至少有n元素 流在什么情况下sLimit可能少于n元素 如果有的话 Stream sLimit s limit n 提问原因 在这个答案 https stackoverflow com a 28082107 829571 我读到
  • 在 Java 中查询 XML 的最简单方法

    我有带有 XML 的小字符串 例如 String myxml
  • 如何加快 jar 签名者的速度?

    我使用 ant 来签署我的 jars 以进行网络启动部署 Ant signjar 在 Web 启动签名时非常慢 如何加快签名过程 我找到了一种可能的解决方案 早些时候 在构建脚本 ant signjar 中 按顺序调用所有 jar 我们使用
  • 以最少插入次数将字符串转换为回文

    这是一个来自日常编码问题 https www dailycodingproblem com 给定一个字符串 找到可以通过插入来组成的回文数 单词中任何位置的字符数尽可能少 如果有 大于一个可以制作的最小长度的回文 返回 字典顺序最早的一个
  • 使用java读取Excel工作表的单列

    我有一张 Excel 表格 我想编写一个方法 该方法将参数作为要读取的列号 并返回一个由该列中的所有数据组成的数组 然后将该列元素放置在 xml 工作表中 我怎样才能编写一个方法来做到这一点 使用 Apache POI 您可以在他们的使用页
  • jsf 中的类型未找到属性

    我正在尝试调用 jsf 中使用 primefaces 的属性 但我有错误 500 在托管bean PersonelBean 类型上找不到 我正在使用 hibernate jsf 和 spring PersonelBean java Mana
  • 系统地将函数应用于 haskell 记录的所有字段

    我有一条包含不同类型字段的记录 以及一个适用于所有这些类型的函数 举一个小 愚蠢 的例子 data Rec Rec flnum Float intnum Int deriving Show 比如说 我想定义一个为每个字段添加两条记录的函数
  • 使用 Mockitos 传递参数化输入

    我正在使用 Mockito 进行单元测试 我想知道是否可以使用 Junit 测试中的方式发送参数化输入参数 e g InjectMocks MockClass mockClass new MockClass Test public void
  • Jar Manifest 文件的使用混乱

    我正在阅读使用 jar 工具打包 java 应用程序 我注意到 META INF 目录下创建了一个清单文件 对于一个简单的应用程序来说 感觉它没有任何作用 我在 stackoverflow 上搜索以了解 Manifest 文件的用法 我碰到
  • 如何映射 Map

    I tried ManyToMany cascade CascadeType ALL Map
  • servlet 如何获取 servlet 之外的文件的绝对路径?

    我们一直在使用 System getProperties user dir 来获取属性文件的位置 现在它已经部署在 Tomcat 上 通过 servlet 系统调用将位置指定为 tomcat 而不是属性文件所在的位置 我们如何动态调用属性文
  • Java 中的可迭代求和?

    有没有一个库可以做到这一点 public class Iterables private Iterables public static
  • Java Calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY),它会向后滚动、向前滚动还是未知?

    假设以下代码在 2009 年 8 月 22 日 星期六 执行 Calendar c Calendar getInstance c set Calendar DAY OF WEEK Calendar SUNDAY c get Calendar
  • 如何使用 AEM 解析 org.apache.http.ssl?

    最终 我尝试在 Java 代码中使用 AWS S3 库来通过 AEM 启用服务器端 S3 上传 但在安装依赖项和 或由 AEM 识别时遇到了问题 每次我添加新的依赖项时 都会弹出五个问题 在我尝试构建的这个包中 这是我看到的错误 The i
  • Java applet 是否会违反同源策略

    我需要请求一些东西并从其他域获取信息 我知道由于同源政策 javascript 无法做到这一点 我的另一个选择是通过我的服务器发出代理请求 我不希望请求来自我的服务器的 IP 也不想为我的服务器创建额外的负载 并且希望客户端这样做 是否可以

随机推荐

  • Java列表参数化?

    我对 Java 很陌生 我写了一个名为 DLPFile 的类 它基本上是其他对象的容器 如字符串 整数 浮点数等 将我的文件放入列表中 然后将其保存在我的会话 来自 Map 类 变量中时很容易 DLPFile file new DLPFil
  • 如何将 .jar 文件安装到 Eclipse 中?

    我已经编写了一个 Eclipse 插件项目并成功导出了 jar 文件 但是当我将 jar 文件复制到 Plugins 文件夹中 也尝试了 dropins 文件夹 并重新启动 Eclipse 后 我仍然无法在 Eclipse Installa
  • sqlalchemy:类型错误:创建实例的不可散列类型,sqlalchemy

    我在尝试更新代码时遇到错误 https github com thrisp flask security https github com thrisp flask security从Python 2 7到3 3 给出以下最基本的实例 te
  • ASCII 转换

    我想将 ASCII 值转换为其相应的字符 所以我编写了这个简单的代码 public class Test public static void main String args int i 0 char ch c for i 0 i lt
  • 如何使用 Symfony2 表单清除字段值

    我正在编写自己的验证码类 当表单未验证时 出于显而易见的原因 我不想用之前的答案预先填充验证码输入 我只想在渲染之前清除输入 我发现了data选项仅适用于默认值 默认值会被用户输入的内容覆盖 我尝试了以下代码 form gt get cap
  • 具有边界约束的 scipy.optimize.leastsq

    我正在寻找 scipy numpy 中的优化例程 它可以解决非线性最小二乘型问题 例如 将参数函数拟合到大型数据集 但包括边界和约束 例如参数的最小值和最大值 优化 目前我正在使用 mpfit 的 python 版本 翻译自 idl 这显然
  • Python:为变量重新赋值(使用函数)[重复]

    这个问题在这里已经有答案了 可能的重复 Python 如何通过引用传递变量 https stackoverflow com questions 986006 python how do i pass a variable by refere
  • Chrome 扩展:如何根据 Ajax 请求重新加载/重新执行内容脚本

    我正在尝试执行某个网站的内容脚本 插入按钮或更改链接 但是我想在用户浏览网站时执行此操作 问题在于网页是在用户浏览时通过 ajax 请求动态构建的 我之前在我编写的扩展中通过将 JavaScript 实际注入到网页中解决了这个问题 我想知道
  • 数据源不支持服务器端数据分页

    我的屏幕上有一个 GridView 需要它来允许分页 Markup
  • 如何在 Visual Studio 2008 中对代码进行排序(按方法名称)?

    除了剪切和粘贴之外 是否有办法在 Visual Studio 2008 中对类中的方法进行排序 我喜欢有序的代码 您可以使用 Visual Studio 2005 2008 扩展区域化 https marketplace visualstu
  • 如何设置UITabBar触摸区域

    我遇到过UITabBar触摸面积问题 上方额外的触摸区域 约 5 个像素 UITabBar被算作是UITabBar 放置在该区域的所有物体都将被阻挡并且UITabBar反而会做出反应 我发现有些人问了同样的问题 以下链接 但无法得到答案 有
  • 如何在 Spring / Tomcat 中完全禁用 JDBC 连接池?

    我正在使用 Spring Data Source bean 来配置 JDBC 连接 返回裸露的 非池化 非托管的 JDBC 连接的最简单方法是什么 我想你正在寻找org springframework jdbc datasource Sim
  • 什么时候在 ASP.NET MVC 中使用 ViewBag/ViewData 是“可接受的”?

    我意识到最佳实践是使用强类型视图并在 ViewModel 中传递所有需要的数据 但我很好奇是否在某些情况下在 ViewBag ViewData 中传递数据实际上被认为是 最佳实践 在什么情况下首选 ViewBag ViewData 将数据传
  • Rails 4:一起使用 MySql 和 MongoDB

    我正在尝试结合使用 MongoDB mongoid 和 MySQL 在 Rails 4 中创建一个应用程序 但我无法设置它 我正在按照以下步骤操作 rails new myapp d mysql 然后将这些行添加到 Gemfile 中 ge
  • 接到电话后应用程序崩溃

    在我接到电话或拨打电话 以及其他未记录的中断 后 我的应用程序在恢复活动时收到 NullPointerException 任何人都可以向我解释它在哪里和 或如何修复它吗 当我的活动恢复时 它似乎正在调用 onCreate 并且它试图执行恢复
  • 如何使用空手道框架用默认值替换键

    我有一个 JSON 文件 如下所示 lastname displayName lastname dynamicKey displayName dynamicKey 当我尝试读取文件时 键和值没有更新 但是当我使用如下所示的 JSON 时 值
  • Team Foundation Server 要求提供登录凭据

    每次我打开 VS2010 和 或尝试连接到 Team Foundation Server 时 它都会要求我提供凭据 我已经对这个问题及其解决方案 包括这个网站 进行了广泛的搜索 但没有一个解决方案有效 尝试连接到 VS2010 中的 Tea
  • Hibernate 库和 Hibernate JPA 库之间的区别

    在可以将 Hibernate 库添加到项目的屏幕中 有两个选项 Hibernate 和 Hibernate JPA 2者有什么区别 谷歌搜索没有提供解释 我发现这提供了一个很好的解释 http elope wordpress com 200
  • scrapy 1.3中,yield请求和return请求有什么区别?

    他们似乎提供了相同的功能 最终通过管道或提要返回字典或项目 我有理由使用其中一种而不是另一种吗 与 return 相反 yield 不会退出函数并继续 与你的for循环 如果您使用 return 您的 for 循环将在第一次迭代后完成 了解
  • 实施 Kruskal 算法时测试电路

    我正在尝试编写一个程序来找到最小生成树 但我在使用该算法时遇到的一个问题是测试电路 在java中执行此操作的最佳方法是什么 好的 这是我的代码 import java io import java util public class Jun