Java 如何通过图中的给定路径覆盖最大数量的节点?
我试图通过给定图形中的路径找出覆盖节点的最大数量。我用递归编制了一个程序,但它只对一些简单的图给出答案,而不是对复杂的图给出答案 输入以字符串数组形式给出,如1#2:表示节点1连接到节点2,反之亦然 我已经建立了一个总节点大小的矩阵,如果节点是连通的,则在矩阵中设置1 else-1。该矩阵用于计算路径中的最大覆盖节点 代码: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
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";
}