Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过图中的给定路径覆盖最大数量的节点?_Java_Recursion_Data Structures - Fatal编程技术网

Java 如何通过图中的给定路径覆盖最大数量的节点?

Java 如何通过图中的给定路径覆盖最大数量的节点?,java,recursion,data-structures,Java,Recursion,Data Structures,我试图通过给定图形中的路径找出覆盖节点的最大数量。我用递归编制了一个程序,但它只对一些简单的图给出答案,而不是对复杂的图给出答案 输入以字符串数组形式给出,如1#2:表示节点1连接到节点2,反之亦然 我已经建立了一个总节点大小的矩阵,如果节点是连通的,则在矩阵中设置1 else-1。该矩阵用于计算路径中的最大覆盖节点 代码: import java.io.*; 导入java.util.*; 公共类媒体 { 包含公共静态int节点; 公共静态int大=0; 访问了[]个公共静态文件; 公共静态i

我试图通过给定图形中的路径找出覆盖节点的最大数量。我用递归编制了一个程序,但它只对一些简单的图给出答案,而不是对复杂的图给出答案

输入以字符串数组形式给出,如1#2:表示节点1连接到节点2,反之亦然

我已经建立了一个总节点大小的矩阵,如果节点是连通的,则在矩阵中设置1 else-1。该矩阵用于计算路径中的最大覆盖节点

代码:

import java.io.*;
导入java.util.*;
公共类媒体
{ 
包含公共静态int节点;
公共静态int大=0;
访问了[]个公共静态文件;
公共静态int矩阵_长度;
公共静态字符串[][]矩阵;
公共静态字符串[]输入=新字符串[]
//答案是7。
{"1#2", "2#3","3#4","3#5","5#6","5#7","6#7","7#8"};
公共静态void main(字符串[]args){
int total_nodes=最大城市(输入);
System.out.println(总节点数);
}
公共静态int maxno_city(字符串[]input1)
{
int ln=input1.length;
HashSet hs=新的HashSet();

对于(int i=0;i,您的主要问题是没有存储完整的矩阵。此循环:

for(int i=0;i<matrix_length;i++)
{
    for(int j=0; j<matrix_length;j++)
    {
        String[] temp=input1[i].split("#");
        int first=Integer.parseInt(temp[0])-1;
        int second=Integer.parseInt(temp[1])-1;
        matrix[first][second]="1";
        matrix[second][first]="1";
    }
}
(由于不需要
i
的值,您可能还希望将其进一步改进为foreach循环)

我通过调试您的代码发现了这一点,并发现它没有递归到某些节点,然后我发现
matrix
不完整。您应该打印
matrix
,以检查它是否正确

其他一些问题:

  • 回溯时必须重置
    已访问的
    数组,否则将无法计算通过同一节点的两条不同路径(取消注释
    已访问的[path]=false;
  • 您不需要
    标志
    :在这两种情况下,您都应该检查是否有新的“高分”,并在离开循环之前减少所覆盖的
    节点
  • 如果有一个城市未连接到图的其余部分,您的代码将失败,因为您的
    Set hs
    将太小。请尝试查找编号最高的节点
一些可能的改进:

  • 矩阵
    转换为
    布尔
    矩阵。这也将消除对其进行初始化的需要
  • getNextPath()
    不需要两个参数。请尝试使用调用位置的
    已访问的\u节点来完成所有需要的操作。然后,您应该能够进一步简化它
  • 如果您设法将其减少为1个参数,则不需要2个嵌套的
    for
    循环来启动递归

这可能是np完全,不确定是否必须check@NikosM.事实上,这是一个NP难问题。我不确定1000个城市在合理的时间内能解决这个问题。@MdMohsin您可以通过将
矩阵
转换为
布尔矩阵来提高可读性和效率。还有
!已访问[I]
..==false
更具可读性。这个问题是NP难的。但是,如果图形是DAG,它是可以处理的。@JuanLopes这里不是这样;-)谢谢你给我提供了有价值的信息,我正在尝试更正你在这里共享的信息中的代码。非常有用的信息。
for(int i=0;i<matrix_length;i++)
{
    for(int j=0; j<matrix_length;j++)
    {
        String[] temp=input1[i].split("#");
        int first=Integer.parseInt(temp[0])-1;
        int second=Integer.parseInt(temp[1])-1;
        matrix[first][second]="1";
        matrix[second][first]="1";
    }
}
for (int i = 0; i < input1.length; i++)
{
    String[] temp = input1[i].split("#");
    int first = Integer.parseInt(temp[0]) - 1;
    int second = Integer.parseInt(temp[1]) - 1;
    matrix[first][second] = "1";
    matrix[second][first] = "1";
}