DFS 算法超出内存限制
Memory limit exceeded in DFS algorithm
我实现了这段代码。
但不幸的是变成了“超时”。
从第一个A[0][0]到最后一个A[n][n]二维数组求路径的算法
我使用了“DFS”算法。
import javax.jnlp.IntegrationService;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class prj{
static boolean[] dfs(byte[][]A,boolean[]v,int num,int start){
v[start]=true;
if(start==num-1){
return v;
}
for (int i = 0; i < num; i++) {
if (A[start][i]==1&&v[i]==false){
dfs(A,v,num,i);
}
}
return v;
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int m=scanner.nextInt();
byte[][] A=new byte[n][n];
for (int i = 0; i <m ; i++) {
int v=scanner.nextInt();
int u=scanner.nextInt();
A[v-1][u-1]=1;
}
boolean visited[]=new boolean[n];
if(A[0][n-1]==1){
System.out.println("YES");
}else {
visited = dfs(A, visited, n, 0);
boolean b = true;
for (int i = 0; i < n; i++) {
if (visited[i] == false) {
System.out.println("NO Path");
b = false;
break;
}
}
if (b == true) {
System.out.println("YES ,Path exists ");
}
}
}
}
你要弄清楚n和m的边界是什么
但是我猜想在这个问题中 m 会比 n * n 小得多。
如果是这种情况,您可以定义一个包含 m 个元素的散列 table,而不是创建 n * n 数组,每个元素都有一对 (v, u) 作为键,“是否访问过”作为布尔值.
Map<Pair<Integer, Integer>, Boolean> nodes = new Hashtable<>();
for (int i = 0; i <m ; i++) {
int v=scanner.nextInt();
int u=scanner.nextInt();
nodes.put(new Pair(v, u), false);
}
因为在散列中读写table具有恒定的时间复杂度,它与定义一个n * n数组的时间复杂度没有区别,但内存效率更高。
我实现了这段代码。
但不幸的是变成了“超时”。
从第一个A[0][0]到最后一个A[n][n]二维数组求路径的算法
我使用了“DFS”算法。
import javax.jnlp.IntegrationService;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class prj{
static boolean[] dfs(byte[][]A,boolean[]v,int num,int start){
v[start]=true;
if(start==num-1){
return v;
}
for (int i = 0; i < num; i++) {
if (A[start][i]==1&&v[i]==false){
dfs(A,v,num,i);
}
}
return v;
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int m=scanner.nextInt();
byte[][] A=new byte[n][n];
for (int i = 0; i <m ; i++) {
int v=scanner.nextInt();
int u=scanner.nextInt();
A[v-1][u-1]=1;
}
boolean visited[]=new boolean[n];
if(A[0][n-1]==1){
System.out.println("YES");
}else {
visited = dfs(A, visited, n, 0);
boolean b = true;
for (int i = 0; i < n; i++) {
if (visited[i] == false) {
System.out.println("NO Path");
b = false;
break;
}
}
if (b == true) {
System.out.println("YES ,Path exists ");
}
}
}
}
你要弄清楚n和m的边界是什么
但是我猜想在这个问题中 m 会比 n * n 小得多。
如果是这种情况,您可以定义一个包含 m 个元素的散列 table,而不是创建 n * n 数组,每个元素都有一对 (v, u) 作为键,“是否访问过”作为布尔值.
Map<Pair<Integer, Integer>, Boolean> nodes = new Hashtable<>();
for (int i = 0; i <m ; i++) {
int v=scanner.nextInt();
int u=scanner.nextInt();
nodes.put(new Pair(v, u), false);
}
因为在散列中读写table具有恒定的时间复杂度,它与定义一个n * n数组的时间复杂度没有区别,但内存效率更高。