最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Java實(shí)現(xiàn)無向環(huán)和有向環(huán)的檢測

 更新時(shí)間:2022年04月06日 11:07:41   作者:之一Yo  
這篇文章主要介紹了如何在?Java?中實(shí)現(xiàn)無向環(huán)和有向環(huán)的檢測,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定的幫助,需要的可以參考一下

無向環(huán)

一個(gè)含有環(huán)的無向圖如下所示,其中有兩個(gè)環(huán),分別是 0-2-1-0 和 2-3-4-2:

要檢測無向圖中的環(huán),可以使用深度優(yōu)先搜索。假設(shè)從頂點(diǎn) 0 出發(fā),再走到相鄰的頂點(diǎn) 2,接著走到頂點(diǎn) 2 相鄰的頂點(diǎn) 1,由于頂點(diǎn) 0 和頂點(diǎn) 1 相鄰,并且頂點(diǎn) 0 被標(biāo)記過了,說明我們饒了一圈,所以無向圖中存在環(huán)。雖然頂點(diǎn) 2 和頂點(diǎn) 1 相鄰,但是并不能說明存在環(huán),因?yàn)槲覀兙褪菑捻旤c(diǎn) 2 直接走到頂點(diǎn) 1 的,這二者只有邊的關(guān)系。算法如下所示:

package com.zhiyiyo.graph;

import com.zhiyiyo.collection.stack.LinkStack;
import com.zhiyiyo.collection.stack.Stack;

/**
 * 無向圖中的環(huán)
 */
public class Cycle {
    private boolean[] marked;
    private Graph graph;
    private boolean hasCycle;

    public Cycle(Graph graph) {
        this.graph = graph;
        marked = new boolean[graph.V()];

        for (int v = 0; v < graph.V(); ++v) {
            if (!marked[v]) {
                dfs(v);
            }
        }
    }

    private void dfs(int s) {
        if (hasCycle()) return;

        Stack<Integer> vertexes = new LinkStack<>();
        vertexes.push(s);
        marked[s] = true;

        int lastVertex = s;
        while (!vertexes.isEmpty()) {
            int v = vertexes.pop();

            for (int w : graph.adj(v)) {
                if (!marked[w]) {
                    marked[w] = true;
                    vertexes.push(w);
                } else if (w != lastVertex) {
                    hasCycle = true;
                    return;
                }
            }

            lastVertex = v;
        }
    }

    /**
     * 圖中是否有環(huán)
     */
    public boolean hasCycle() {
        return hasCycle;
    }
}

有向環(huán)

有向圖

有向圖的實(shí)現(xiàn)方式和上一篇博客 《如何在 Java 中實(shí)現(xiàn)無向圖》 中無向圖的實(shí)現(xiàn)方式幾乎一樣,只是在添加邊 v-w 時(shí)只在頂點(diǎn) v 的鏈表上添加頂點(diǎn) w,而不對(duì)頂點(diǎn) w 的鏈表進(jìn)行操作。如果把 LinkGraph 中成員變量的訪問權(quán)限改成 protected,只需繼承并重寫 addEdge 方法即可:

package com.zhiyiyo.graph;


public class LinkDigraph extends LinkGraph implements Digraph {

    public LinkDigraph(int V) {
        super(V);
    }

    @Override
    public void addEdge(int v, int w) {
        adj[v].push(w);
        E++;
    }

    @Override
    public Digraph reverse() {
        Digraph digraph = new LinkDigraph(V());
        for (int v = 0; v < V(); ++v) {
            for (int w : adj(v)) {
                digraph.addEdge(w, v);
            }
        }
        return digraph;
    }
}

檢測算法

一個(gè)含有有向環(huán)的有向圖如下所示,其中 5-4-3-5 構(gòu)成了一個(gè)環(huán):

這里使用遞歸實(shí)現(xiàn)的深度優(yōu)先搜索來檢測有向環(huán)。假設(shè)從頂點(diǎn) 0 開始走,一路經(jīng)過 5、4、3 這三個(gè)頂點(diǎn),最終又碰到了與頂點(diǎn) 3 相鄰的頂點(diǎn) 5,這時(shí)候如果知道頂點(diǎn) 5 已經(jīng)被訪問過了,并且遞歸函數(shù)還被壓在棧中,就說明深度優(yōu)先搜索從頂點(diǎn) 5 開始走,又回到了頂點(diǎn) 5,也就是找到了有向環(huán)。算法如下所示:

package com.zhiyiyo.graph;

import com.zhiyiyo.collection.stack.LinkStack;
import com.zhiyiyo.collection.stack.Stack;

/**
 * 有向圖中的環(huán)
 */
public class DirectedCycle {
    private boolean[] marked;
    private boolean[] onStack;
    private int[] edgeTo;
    private Graph graph;
    private Stack<Integer> cycle;

    public DirectedCycle(Digraph graph) {
        this.graph = graph;
        marked = new boolean[graph.V()];
        onStack = new boolean[graph.V()];
        edgeTo = new int[graph.V()];

        for (int v = 0; v < graph.V(); ++v) {
            if (!marked[v]) {
                dfs(v);
            }
        }
    }

    private void dfs(int v) {
        marked[v] = true;
        onStack[v] = true;

        for (int w : graph.adj(v)) {
            if (hasCycle()) return;
            if (!marked[w]) {
                marked[w] = true;
                edgeTo[w] = v;
                dfs(w);
            } else if (onStack[w]) {
                cycle = new LinkStack<>();
                cycle.push(w);
                for (int i = v; i != w; i = edgeTo[i]) {
                    cycle.push(i);
                }
                cycle.push(w);
            }
        }

        onStack[v] = false;
    }

    /**
     * 圖中是否有環(huán)
     */
    public boolean hasCycle() {
        return cycle != null;
    }

    /**
     * 圖中的一個(gè)環(huán)
     */
    public Iterable<Integer> cycle() {
        return cycle;
    }
}

以上就是基于Java實(shí)現(xiàn)無向環(huán)和有向環(huán)的檢測的詳細(xì)內(nèi)容,更多關(guān)于Java無向環(huán) 有向環(huán)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • HttpClient的KeepAlive接口方法源碼解析

    HttpClient的KeepAlive接口方法源碼解析

    這篇文章主要為大家介紹了HttpClient的KeepAlive接口方法源碼解析,
    有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • 初學(xué)者易上手的SSH-struts2 01環(huán)境搭建(圖文教程)

    初學(xué)者易上手的SSH-struts2 01環(huán)境搭建(圖文教程)

    下面小編就為大家?guī)硪黄鯇W(xué)者易上手的SSH-struts2 01環(huán)境搭建(圖文教程)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • 一文秒懂?kafka?HA(高可用)

    一文秒懂?kafka?HA(高可用)

    這篇文章主要介紹了秒懂?kafka?HA(高可用)的相關(guān)知識(shí),本文我們來說一說和?kafka?高可用相關(guān)的一些策略,對(duì)kafka?HA相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-11-11
  • MyBatis官方代碼生成工具給力(解放雙手)

    MyBatis官方代碼生成工具給力(解放雙手)

    這篇文章主要介紹了MyBatis官方代碼生成工具給力(解放雙手),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Java數(shù)據(jù)結(jié)構(gòu)與算法之棧(Stack)實(shí)現(xiàn)詳解

    Java數(shù)據(jù)結(jié)構(gòu)與算法之棧(Stack)實(shí)現(xiàn)詳解

    這篇文章主要為大家詳細(xì)介紹了Java數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)筆記第二篇,Java數(shù)據(jù)結(jié)構(gòu)與算法之棧Stack實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • SpringBoot 下在 yml 中的 logging 日志配置方法

    SpringBoot 下在 yml 中的 logging 日志配置方法

    logging 配置主要用于控制應(yīng)用程序的日志輸出行為,可以通過配置定制日志的格式、級(jí)別、輸出位置等,這篇文章主要介紹了SpringBoot 下在 yml 中的 logging 日志配置,需要的朋友可以參考下
    2024-06-06
  • Spring中Cache的使用方法詳解

    Spring中Cache的使用方法詳解

    這篇文章主要介紹了Spring中Cache的使用方法詳解,Spring Cache 是一個(gè)框架,實(shí)現(xiàn)了基于注解的緩存功能,只需要簡單地加一個(gè)注解,就能實(shí)現(xiàn)緩存功能,Spring Cache 提供了一層抽象,底層可以切換不同的緩存實(shí)現(xiàn),需要的朋友可以參考下
    2024-01-01
  • spring boot 集成 shiro 自定義密碼驗(yàn)證 自定義freemarker標(biāo)簽根據(jù)權(quán)限渲染不同頁面(推薦

    spring boot 集成 shiro 自定義密碼驗(yàn)證 自定義freemarker標(biāo)簽根據(jù)權(quán)限渲染不同頁面(推薦

    這篇文章主要介紹了spring-boot 集成 shiro 自定義密碼驗(yàn)證 自定義freemarker標(biāo)簽根據(jù)權(quán)限渲染不同頁面,需要的朋友可以參考下
    2018-12-12
  • MybatisPlus查詢條件空字符串和NULL問題背景分析

    MybatisPlus查詢條件空字符串和NULL問題背景分析

    文章詳細(xì)分析了MybatisPlus在處理查詢條件時(shí),空字符串和NULL值的問題,MP 3.3.0及以上版本提供了多種解決方法,包括在Bean屬性上使用注解、全局配置等,推薦使用全局配置的方式來解決這個(gè)問題,以避免在SQL查詢中出現(xiàn)不必要的空字符串條件,感興趣的朋友跟隨小編一起看看吧
    2025-03-03
  • SpringBoot2.0整合jackson配置日期格式化和反序列化的實(shí)現(xiàn)

    SpringBoot2.0整合jackson配置日期格式化和反序列化的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot2.0整合jackson配置日期格式化和反序列化的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-11-11

最新評(píng)論

十堰市| 东山县| 芜湖县| 上林县| 桦甸市| 志丹县| 凤冈县| 呼伦贝尔市| 巨鹿县| 措美县| 兰溪市| 神木县| 开封市| 武邑县| 富平县| 镶黄旗| 巴林右旗| 潮州市| 蒙自县| 景东| 通化县| 安顺市| 东至县| 库伦旗| 安顺市| 乐业县| 伊川县| 贵溪市| 肥城市| 定西市| 西藏| 旌德县| 突泉县| 曲沃县| 万载县| 三门峡市| 商水县| 辽阳县| 封丘县| 花垣县| 镇雄县|