@@ -409,9 +409,186 @@ int main() {
409
409
## 其他语言版本
410
410
411
411
### Java
412
+ #### 邻接矩阵写法
413
+ ``` java
414
+ import java.util.ArrayList ;
415
+ import java.util.List ;
416
+ import java.util.Scanner ;
417
+
418
+ public class Main {
419
+ static List<List<Integer > > result = new ArrayList<> (); // 收集符合条件的路径
420
+ static List<Integer > path = new ArrayList<> (); // 1节点到终点的路径
421
+
422
+ public static void dfs (int [][] graph , int x , int n ) {
423
+ // 当前遍历的节点x 到达节点n
424
+ if (x == n) { // 找到符合条件的一条路径
425
+ result. add(new ArrayList<> (path));
426
+ return ;
427
+ }
428
+ for (int i = 1 ; i <= n; i++ ) { // 遍历节点x链接的所有节点
429
+ if (graph[x][i] == 1 ) { // 找到 x链接的节点
430
+ path. add(i); // 遍历到的节点加入到路径中来
431
+ dfs(graph, i, n); // 进入下一层递归
432
+ path. remove(path. size() - 1 ); // 回溯,撤销本节点
433
+ }
434
+ }
435
+ }
412
436
413
- ### Python
437
+ public static void main (String [] args ) {
438
+ Scanner scanner = new Scanner (System . in);
439
+ int n = scanner. nextInt();
440
+ int m = scanner. nextInt();
441
+
442
+ // 节点编号从1到n,所以申请 n+1 这么大的数组
443
+ int [][] graph = new int [n + 1 ][n + 1 ];
444
+
445
+ for (int i = 0 ; i < m; i++ ) {
446
+ int s = scanner. nextInt();
447
+ int t = scanner. nextInt();
448
+ // 使用邻接矩阵表示无向图,1 表示 s 与 t 是相连的
449
+ graph[s][t] = 1 ;
450
+ }
451
+
452
+ path. add(1 ); // 无论什么路径已经是从1节点出发
453
+ dfs(graph, 1 , n); // 开始遍历
454
+
455
+ // 输出结果
456
+ if (result. isEmpty()) System . out. println(- 1 );
457
+ for (List<Integer > pa : result) {
458
+ for (int i = 0 ; i < pa. size() - 1 ; i++ ) {
459
+ System . out. print(pa. get(i) + " " );
460
+ }
461
+ System . out. println(pa. get(pa. size() - 1 ));
462
+ }
463
+ }
464
+ }
465
+ ```
466
+
467
+ #### 邻接表写法
468
+ ``` java
469
+ import java.util.ArrayList ;
470
+ import java.util.LinkedList ;
471
+ import java.util.List ;
472
+ import java.util.Scanner ;
473
+
474
+ public class Main {
475
+ static List<List<Integer > > result = new ArrayList<> (); // 收集符合条件的路径
476
+ static List<Integer > path = new ArrayList<> (); // 1节点到终点的路径
477
+
478
+ public static void dfs (List<LinkedList<Integer > > graph , int x , int n ) {
479
+ if (x == n) { // 找到符合条件的一条路径
480
+ result. add(new ArrayList<> (path));
481
+ return ;
482
+ }
483
+ for (int i : graph. get(x)) { // 找到 x指向的节点
484
+ path. add(i); // 遍历到的节点加入到路径中来
485
+ dfs(graph, i, n); // 进入下一层递归
486
+ path. remove(path. size() - 1 ); // 回溯,撤销本节点
487
+ }
488
+ }
489
+
490
+ public static void main (String [] args ) {
491
+ Scanner scanner = new Scanner (System . in);
492
+ int n = scanner. nextInt();
493
+ int m = scanner. nextInt();
494
+
495
+ // 节点编号从1到n,所以申请 n+1 这么大的数组
496
+ List<LinkedList<Integer > > graph = new ArrayList<> (n + 1 );
497
+ for (int i = 0 ; i <= n; i++ ) {
498
+ graph. add(new LinkedList<> ());
499
+ }
500
+
501
+ while (m-- > 0 ) {
502
+ int s = scanner. nextInt();
503
+ int t = scanner. nextInt();
504
+ // 使用邻接表表示 s -> t 是相连的
505
+ graph. get(s). add(t);
506
+ }
414
507
508
+ path. add(1 ); // 无论什么路径已经是从1节点出发
509
+ dfs(graph, 1 , n); // 开始遍历
510
+
511
+ // 输出结果
512
+ if (result. isEmpty()) System . out. println(- 1 );
513
+ for (List<Integer > pa : result) {
514
+ for (int i = 0 ; i < pa. size() - 1 ; i++ ) {
515
+ System . out. print(pa. get(i) + " " );
516
+ }
517
+ System . out. println(pa. get(pa. size() - 1 ));
518
+ }
519
+ }
520
+ }
521
+ ```
522
+ ### Python
523
+ #### 邻接矩阵写法
524
+ ``` python
525
+ def dfs (graph , x , n , path , result ):
526
+ if x == n:
527
+ result.append(path.copy())
528
+ return
529
+ for i in range (1 , n + 1 ):
530
+ if graph[x][i] == 1 :
531
+ path.append(i)
532
+ dfs(graph, i, n, path, result)
533
+ path.pop()
534
+
535
+ def main ():
536
+ n, m = map (int , input ().split())
537
+ graph = [[0 ] * (n + 1 ) for _ in range (n + 1 )]
538
+
539
+ for _ in range (m):
540
+ s, t = map (int , input ().split())
541
+ graph[s][t] = 1
542
+
543
+ result = []
544
+ dfs(graph, 1 , n, [1 ], result)
545
+
546
+ if not result:
547
+ print (- 1 )
548
+ else :
549
+ for path in result:
550
+ print (' ' .join(map (str , path)))
551
+
552
+ if __name__ == " __main__" :
553
+ main()
554
+ ```
555
+
556
+ #### 邻接表写法
557
+ ``` python
558
+ from collections import defaultdict
559
+
560
+ result = [] # 收集符合条件的路径
561
+ path = [] # 1节点到终点的路径
562
+
563
+ def dfs (graph , x , n ):
564
+ if x == n: # 找到符合条件的一条路径
565
+ result.append(path.copy())
566
+ return
567
+ for i in graph[x]: # 找到 x指向的节点
568
+ path.append(i) # 遍历到的节点加入到路径中来
569
+ dfs(graph, i, n) # 进入下一层递归
570
+ path.pop() # 回溯,撤销本节点
571
+
572
+ def main ():
573
+ n, m = map (int , input ().split())
574
+
575
+ graph = defaultdict(list ) # 邻接表
576
+ for _ in range (m):
577
+ s, t = map (int , input ().split())
578
+ graph[s].append(t)
579
+
580
+ path.append(1 ) # 无论什么路径已经是从1节点出发
581
+ dfs(graph, 1 , n) # 开始遍历
582
+
583
+ # 输出结果
584
+ if not result:
585
+ print (- 1 )
586
+ for pa in result:
587
+ print (' ' .join(map (str , pa)))
588
+
589
+ if __name__ == " __main__" :
590
+ main()
591
+ ```
415
592
### Go
416
593
417
594
### Rust
0 commit comments