呜啊改哭我了,OJ不能识别多个Scanner……(虽然不只有这个错QAQ)
题目描述
给你一个有n个节点的有向无环图(DAG),请你使用回溯算法找出所有从节点0到节点n-1的路径并输出(要求按照字典顺序输出)。
graph[i]是一个从节点i可以访问的所有节点的列表(即从节点i到节点graph[i][j]存在一条有向边)。
输入:
第一行为整数N,接下来N行为节点的列表
输出:
按字典顺序排列的若干行节点列表
示例1:
输入:graph = [[1,2], [3], [3], []]
输出:[[0,1,3], [0,2,3]]
解释:有两条路径 0 -> 1 -> 3 和 0 -> 2 -> 3
提示:
- n == graph.length
- 2 <= n <= 15
- 0 <= graph[i][j] < n
- graph[i][j] != i (即不存在自环)
- graph[i]中的所有元素互不相同
- 保证输入为有向无环图
样例输入输出
样例1
输入:
4
1 2
3
3
//该处为换行
输出:
0 1 3 //末尾有空格
0 2 3
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class Main {
static int N;
static ArrayList<Integer> road = new ArrayList();
static ArrayList<ArrayList<Integer>> graph = new ArrayList<>();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt() - 1;
String line1 = sc.nextLine();
for (int i = 0; i <= N; i++)
{
String line = sc.nextLine();
if(line.length() == 0)
{
ArrayList<Integer> list = new ArrayList<>();
graph.add(list);
}
else
{
ArrayList<Integer> row = new ArrayList();
String[] cells = line.split("\\s+");
for (String cell : cells)
row.add(Integer.parseInt(cell));
graph.add(row);
}
}
for (int i = 0; i < graph.size(); i++)
Collections.sort(graph.get(i));
TrackBack(0);
}
public static void TrackBack(int id) {
for (int j = 0; j < graph.get(id).size(); j++)
{
if (graph.get(id).get(j) == N)
{
road.add(id);
road.add(N);
for (int k : road)
System.out.print(k + " ");
System.out.println();
road.remove(road.size() - 1);
road.remove(road.size() - 1);
return;
}
else
{
road.add(id);
TrackBack(graph.get(id).get(j));
road.remove(road.size() - 1);
}
}
}
}