博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DFS寻找路径~
阅读量:4215 次
发布时间:2019-05-26

本文共 2064 字,大约阅读时间需要 6 分钟。

给定起点 找到从起点到各点的路径。

注意:此法只适用于简单路径(无环)

1 2

1 3
2 4
3 4

这一组就含有环 不可以,因为 记录4号顶点父节点的时候 path[]只能记录最后访问到4的那个父节点

package Graph;import java.util.Iterator;import java.util.LinkedList;import java.util.List;import java.util.Scanner;import java.util.Stack;import javax.security.auth.x500.X500Principal;public class ShorPaths {	private int []path;//记录路径	private boolean[] visit;	private int s;	private int v, e;	List
[]map; public static void main(String[] args) { new ShorPaths().run(); } public void run() { Scanner in = new Scanner(System.in); v = in.nextInt(); e = in.nextInt(); map = new LinkedList[v]; for(int i = 0; i < v; i++ ) { map[i] = new LinkedList<>(); } for(int i = 0; i < e; i++) { int a = in.nextInt(); int b = in.nextInt(); map[a].add(b); map[b].add(a); } DepthFirstSearch(map, 0); printPath(); } public void printPath() { for(int i = 0; i < map.length; i++ ) { if(!visit[i])//判断是否有路径 continue; System.out.print(s+ " to " + i +": "); Stack
stack = pathTo(i); boolean flag = true; while(!stack.isEmpty()) { if(flag) { System.out.print(stack.pop()); flag = false; } else System.out.print("-"+ stack.pop()); } System.out.println(); } } public void DepthFirstSearch(List[] map, int s) { path = new int[v]; visit = new boolean[v]; dfs(s); } public void dfs(int cur) { visit[cur] = true; for(int i = 0; i < map[cur].size(); i++ ) {//注意这里是map[cur].size()而不是map.length int v = map[cur].get(i); if(!visit[v]) { visit[v] = true; path[v] = cur; dfs(v); } } } public Stack
pathTo(int v){ if(!visit[v]) return null; Stack
stack = new Stack<>(); for(int x = v; x != s; x = path[x]) stack.push(x); stack.push(s);// Iterator
it = stack.iterator();// while(it.hasNext()) {// System.out.print(it.next() + " ");// } return stack; }}

另一种递归打印 路径的方法 (数据大时候不要用)

public void print(int[]path, int v) {		if(s == v)			System.out.print(s);		else {			print(path, path[v]);			System.out.print("-"+ v);		}	}

转载地址:http://zlimi.baihongyu.com/

你可能感兴趣的文章
怎样做可靠的分布式锁,Redlock 真的可行么?
查看>>
[图文] Seata AT 模式分布式事务源码分析
查看>>
pm 源码分析
查看>>
Sending the User to Another App
查看>>
kmsg_dump
查看>>
Getting a Result from an Activity
查看>>
Allowing Other Apps to Start Your Activity
查看>>
dev/mem
查看>>
pfn_valid 源码分析
查看>>
dev/kmem 和dev/mem的区别
查看>>
checkbox
查看>>
Sending Simple Data to Other Apps
查看>>
Receiving Simple Data from Other Apps
查看>>
中断API之__tasklet_schedule
查看>>
中断API之enable_irq
查看>>
中断API之disable_irq
查看>>
nova 中的guestfs
查看>>
nova中的localfs
查看>>
utils/rpm_build.sh
查看>>
查看模块参数
查看>>