Md *_*sin 5 java recursion data-structures
我试图通过给定图表中的路径找出覆盖节点的最大数量.我已经使用递归制作了一个程序,但它只给出了一些简单的图形,而不是复杂的图形.
输入以字符串数组(如1#2)给出:表示节点1连接到节点2,反之亦然.
我已经制作了一个总节点大小的矩阵,如果节点连接,则在矩阵中设置1,否则为-1.该矩阵用于计算路径中的最大覆盖节点.
码:
import java.io.*;
import java.util.*;
public class Medium
{
public static int node_covered;
public static int big=0;
public static boolean[] visited;
public static int matrix_length;
public static String[][] matrix;
public static String[] input=new String[]
//answer is 7.
{"1#2", "2#3","3#4","3#5","5#6","5#7","6#7","7#8"};
public static void main(String[] args){
int total_nodes=maxno_city(input);
System.out.println(total_nodes);
}
public static int maxno_city(String[] input1)
{
int ln=input1.length;
HashSet hs = new HashSet();
for(int i=0; i<ln;i++)
{
String[] temp=input1[i].split("#");
hs.add(temp[0]);
hs.add(temp[1]);
}
matrix_length=hs.size();
hs.clear();
matrix=new String[matrix_length][matrix_length];
//initialize matrix
for (String[] row : matrix)
Arrays.fill(row, "-1");
//System.out.println(Arrays.deepToString(matrix));
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";
}
}
//System.out.println(Arrays.deepToString(matrix));
//initialized
//now start work on matrix
for(int i=0;i<matrix_length;i++)
{
for(int j=0; j<matrix_length;j++)
{
visited=new boolean[matrix_length];
if(matrix[i][j].equals("1"))
{
node_covered=0;
getNextPath(j,i);
//visited[i]=true;
}
}
}
return big;
}
//recursive method
public static void getNextPath(int path,int visited_node)
{
boolean flag=false;
visited[visited_node]=true;
node_covered++;
for(int i=0;i<matrix_length;i++)
{
if(matrix[path][i].equals("1") && visited[i]==false)
{
//visited[i]=true;
flag=true;
getNextPath(i,path);
//visited[i]=false;
}
}
if(flag==false)
{
if(big<node_covered)
{
big=node_covered;
//System.out.println(big);
}
}
else
{
node_covered--;
}
//visited[path]=false;
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码我在哪里做错了?
您的主要问题是您没有存储完整的矩阵。这个循环:
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";
}
}
Run Code Online (Sandbox Code Playgroud)
无法正确迭代input1以填充matrix. 因此,最后的输入将被忽略(您还可以看到j在内循环中根本没有使用)。因此,您应该将其更改为正确的迭代:
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";
}
Run Code Online (Sandbox Code Playgroud)
(您可能还想将其进一步改进为foreach循环,因为您不需要 的值i)
我通过调试代码并发现它不会递归到某些节点来发现这一点,然后我发现这matrix是不完整的。您应该打印matrix以检查它是否正确。
其他一些问题:
visited数组,否则将无法评估经过同一节点的 2 条不同路径(取消注释visited[path]=false;)flag:在这两种情况下,您应该检查是否有新的“高分”并node_covered在离开循环之前减少Set hs太小了。尝试寻找编号最大的节点。一些可能的改进:
matrix为boolean矩阵。这也将消除对其进行初始化的需要。getNextPath()。visited_node尝试在呼叫地点做您需要做的一切。然后您应该能够进一步简化它。for循环来启动递归。| 归档时间: |
|
| 查看次数: |
500 次 |
| 最近记录: |