在有向图中遍历输出两点之间的所有路径

本文介绍了一种在有向图中寻找从起点到终点所有可能路径的算法。通过使用深度优先搜索(DFS)和回溯策略,算法能够有效地遍历图中的每一条路径,并在找到目标时输出当前路径。文章提供了详细的Java实现代码,包括图的初始化、边的添加、路径的搜索和打印。
import java.util.*;
/*
 * 在有向图中遍历两点之间的所有路径,节点从0开始记
 */
public class Main {
	static Scanner sc = new Scanner(System.in);
	static int n,m;//顶点数,边数
	static int start,end;//源点,终点
	static List<Integer>[] g;//有向图的邻接矩阵
	static List<Integer> stack;//栈
	static boolean[][] visit;//路段ij是否已经走过
	
	static void addE(int from,int to){//添加边
		g[from].add(to);
	}
	
	static void vt(){//访问栈顶元素
		if(stack.isEmpty())//栈为空,说明已经走完所有路径
			System.exit(0);
		else
			dfs(stack.get(stack.size()-1));
	}
	
	static void dfs(int v){
		if(v==end){//v是终点
			System.out.println(stack.toString());
			stack.remove(stack.size()-1);//把v弹出
			vt();
		}
		else{//v不是终点
			for(int i=0;i<g[v].size();i++){//遍历v的所有邻接点i
				if(!visit[v][g[v].get(i)]){//若vi还未走过
					visit[v][g[v].get(i)]=true;
					stack.add(g[v].get(i));
					dfs(g[v].get(i));
				}
				if(i==g[v].size()-1){//v的所有邻接点已经全部访问完
					stack.remove(stack.size()-1);//把v弹出
					vt();
				}
			}
		}
	}
	
	static void init(){
		n=sc.nextInt();
		m=sc.nextInt();
		start=sc.nextInt();
		end=sc.nextInt();
		g=new ArrayList[n];
		for(int i=0;i<n;i++)
			g[i]=new ArrayList<Integer>();
		visit=new boolean[n][n];
		for(int i=0;i<m;i++)
			addE(sc.nextInt(),sc.nextInt());
		stack=new ArrayList<Integer>();
	}
	
    public static void main(String[] args) {
    	init();
    	stack.add(start);
    	dfs(start);
    }
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值