0基础学Java:Lab8-回溯算法-所有可能的路径

        呜啊改哭我了,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);
			}
		}
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值