import java.util.*;
public class Main{
static List<List<Integer>> res=new ArrayList<List<Integer>>();
static List<Integer> list=new ArrayList<>();
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int m=in.nextInt();
int[][] graph=new int[n+1][n+1];
for(int i=0;i<m;i++){
int a=in.nextInt();
int b=in.nextInt();
graph[a][b]=1;
}
list.add(1);
dfs(graph,1,n);
if(res.isEmpty())System.out.println(-1);
for(List<Integer> tmp:res){
for(int i=0;i<tmp.size()-1;i++){
System.out.print(tmp.get(i)+" ");
}
System.out.println(tmp.get(tmp.size()-1));
}
}
public static void dfs(int[][] graph,int x,int n){//x表示当前遍历到的节点
if(x==n){
res.add(new ArrayList<>(list));
return;
}
for(int i=1;i<=n;i++){
if(graph[x][i]==1){
list.add(i);
dfs(graph,i,n);
list.remove(list.size()-1);
}
}
}
}
使用邻接表存储
java复制代码
List<List<Integer>> graph = new ArrayList<List<Integer>>(n + 1);
for(int i=0;i<=n;i++){
graph.add(new ArrayList<>());
}
for (int i = 0; i < m; i++) {
int a = in.nextInt();
int b = in.nextInt();
graph.get(a).add(b);
}
使用领接表存储的dfs的写法:
java复制代码
public static void dfs(List<List<Integer>> graph, int x, int n) { //x表示当前遍历到的节点
if (x == n) {
res.add(new ArrayList<>(list));
return;
}
for (int i : graph.get(x)) {
list.add(i);
dfs(graph, i, n);
list.remove(list.size() - 1);
}
}
打印结果:
java复制代码
if (res.isEmpty()) System.out.println(-1);
for (List<Integer> tmp : res) {
for (int i = 0; i < tmp.size() - 1; i++) {
System.out.print(tmp.get(i) + " ");
}
System.out.println(tmp.get(tmp.size() - 1));
}
整体代码如下:
java复制代码
import java.util.*;
public class Main {
static List<List<Integer>> res = new ArrayList<List<Integer>>();
static List<Integer> list = new ArrayList<>();
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
//邻接表写法
List<List<Integer>> graph = new ArrayList<List<Integer>>(n + 1);
for(int i=0;i<=n;i++){
graph.add(new ArrayList<>());
}
for (int i = 0; i < m; i++) {
int a = in.nextInt();
int b = in.nextInt();
graph.get(a).add(b);
}
list.add(1);
dfs(graph, 1, n);
if (res.isEmpty()) System.out.println(-1);
for (List<Integer> tmp : res) {
for (int i = 0; i < tmp.size() - 1; i++) {
System.out.print(tmp.get(i) + " ");
}
System.out.println(tmp.get(tmp.size() - 1));
}
}
public static void dfs(List<List<Integer>> graph, int x, int n) { //x表示当前遍历到的节点
if (x == n) {
res.add(new ArrayList<>(list));
return;
}
for (int i : graph.get(x)) {
list.add(i);
dfs(graph, i, n);
list.remove(list.size() - 1);
}
}
}