图论 应用篇

本文介绍了图论在实际问题中的应用,主要包括使用深度优先和广度优先搜索解决路径问题,连通分量的判断,以及双色问题。深度优先搜索通过递归遍历所有可能的路径,而广度优先搜索则采用队列逐层扩展。此外,还讨论了如何确定图的连通分量和判断图是否为二分图的基本实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上次写了篇图的基本构造方法,运用图这种强大的数据结构结构,还能解决实际应用中的许多问题,今天这篇就主要整理一些常见的应用

一、路径问题

路径问题在图的处理领域是非常重要的。如我们最常见的走迷宫,就是典型的寻路问题。这里主要运用深度优先和广度优先算法两种方式来进行路径寻找,这2种搜索算法在很多数据结构中都有重要的运用,之前写的一篇二叉查找树中的层序遍历就用到了广度优先算法,这里就详细的介绍一下。

1.深度优先寻找路径

首先是深度优先,为了更加形象,直接看下图

这里以顶点1为出发点,4为终点。假设一个人要走到终点,从1出发有三条路径,首先沿着往5的路径进行遍历,依次1 -> 5 -> 9 -> 8,然后发现没路了,就返回上一顶点,到顶点5这里发现还有一条路就继续沿着这条路走,5->3->6,结果又没路了,就继续返回到起点,沿着另一条路行走……1->2->4,一看,这下就直接到终点了,转了几条路终于找到了终点,那心里真是无比的兴奋啊!回到正题,看看这个具体实现,可以用一个boolean类型的变量来标记是否遍历过该顶点,用一个int型的变量表示从起点到一个顶点的已知路径上的最后一个顶点。至于图的基本构造可以参考我之前写的图论基础篇

/**
 *  图的深度优先查找路径
 * @author Legend
 */
public class DepthFirstPaths {
   

    private boolean[] marked; // 该顶点是否调用过dfs
    private int[] edgeTo; // 从起点到一个顶点的已知路径上的最后一个顶点
    private final int s; // 起点
    // 图的初始化
    public DepthFirstPaths(Graph G,int s) {
        marked = new boolean[G.V()];
        edgeTo = new int[G.V()];
        this.s = s;
        dfs(G,s);
    }
    // 深度优先主方法
    private void dfs(Graph G,int v) {
        marked[v] = true;
        // 遍历与顶点v相连的边
        for (int w : G.adj(v)) {  
            if (!marked[w]) {
                edgeTo[w] 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值