欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java查找無向連通圖中兩點(diǎn)間所有路徑的算法

 更新時(shí)間:2019年01月17日 09:42:25   作者:xfisi  
這篇文章主要介紹了java查找無向連通圖中兩點(diǎn)間所有路徑的算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

之前就這個(gè)問題發(fā)帖求教過,過了幾天沒看到回復(fù)就沒再關(guān)心。后來自己設(shè)計(jì)了一個(gè)算法,在公司的項(xiàng)目中實(shí)踐了一下,效果還可以,貼出來供大家參考。

算法要求:

1. 在一個(gè)無向連通圖中求出兩個(gè)給定點(diǎn)之間的所有路徑;
2. 在所得路徑上不能含有環(huán)路或重復(fù)的點(diǎn);

算法思想描述:

1. 整理節(jié)點(diǎn)間的關(guān)系,為每個(gè)節(jié)點(diǎn)建立一個(gè)集合,該集合中保存所有與該節(jié)點(diǎn)直接相連的節(jié)點(diǎn)(不包括該節(jié)點(diǎn)自身);

2. 定義兩點(diǎn)一個(gè)為起始節(jié)點(diǎn),另一個(gè)為終點(diǎn),求解兩者之間的所有路徑的問題可以被分解為如下所述的子問題:對(duì)每一個(gè)與起始節(jié)點(diǎn)直接相連的節(jié)點(diǎn),求解它到終點(diǎn)的所有路徑(路徑上不包括起始節(jié)點(diǎn))得到一個(gè)路徑集合,將這些路徑集合相加就可以得到起始節(jié)點(diǎn)到終點(diǎn)的所有路徑;依次類推就可以應(yīng)用遞歸的思想,層層遞歸直到終點(diǎn),若發(fā)現(xiàn)希望得到的一條路徑,則轉(zhuǎn)儲(chǔ)并打印輸出;若發(fā)現(xiàn)環(huán)路,或發(fā)現(xiàn)死路,則停止尋路并返回;

3. 用棧保存當(dāng)前已經(jīng)尋到的路徑(不是完整路徑)上的節(jié)點(diǎn),在每一次尋到完整路徑時(shí)彈出棧頂節(jié)點(diǎn);而在遇到從棧頂節(jié)點(diǎn)無法繼續(xù)向下尋路時(shí)也彈出該棧頂節(jié)點(diǎn),從而實(shí)現(xiàn)回溯。

算法偽碼(java描述):

public Stack stack = new Stack();/*臨時(shí)保存路徑節(jié)點(diǎn)的棧*/
public ArrayList sers = new ArrayList();/*存儲(chǔ)路徑的集合*/

public class Node/*表示一個(gè)節(jié)點(diǎn)以及和這個(gè)節(jié)點(diǎn)相連的所有節(jié)點(diǎn)*/
  {
    public String name = null; 
    public ArrayList relationNodes = new ArrayList();
   
    public String getName()
    {
      return name;
    }
    
    public void setName(String name)
    {
      this.name = name;
    }
    
    public ArrayList getRelationNodes()
    {
      return relationNodes;
    }
    
    public void setRelationNodes(ArrayList relationNodes)
    {
      this.relationNodes = relationNodes;
    }
  }

public boolean isNodeInStack(Node node)/*判斷節(jié)點(diǎn)是否在棧中*/
  {
    Iterator it = stack.iterator();
    while(it.hasNext())
    {
      Node node1 = (Node)it.next();
      if(node == node1)
        return true;
    }
    return false;
  }

public void showAndSavePath ()/*此時(shí)棧中的節(jié)點(diǎn)組成一條所求路徑,轉(zhuǎn)儲(chǔ)并打印輸出*/
  {
    Object[] o = stack.toArray();
    for(int i = 0;i<o.length;i++)
    {
      System.out.print(o[i]);
    }
    sers.add(o); /*轉(zhuǎn)儲(chǔ)*/
    System.out.println("\n");
  }

/*尋找路徑的方法*/
public boolean getPaths(Node cNode, Node pNode, Node sNode, Node eNode)
/*cNode表示當(dāng)前的起始節(jié)點(diǎn)currentNode,pNode表示當(dāng)前起始節(jié)點(diǎn)的上一節(jié)點(diǎn)previousNode,sNode表示最初的起始節(jié)點(diǎn)startNode,eNode表示終點(diǎn)endNode*/
  {
    Node nNode = null;
    if(cNode != null && pNode != null && cNode == pNode)
      return false;/*如果符合條件判斷說明出現(xiàn)環(huán)路,不能再順著該路徑繼續(xù)尋路,返回false*/
    if(cNode != null)
    {
      int i = 0;
      stack.push(cNode);/*起始節(jié)點(diǎn)入棧*/
      if(cNode == eNode)/*如果該起始節(jié)點(diǎn)就是終點(diǎn),說明找到一條路徑*/
      {
        showAndSavePath();/*轉(zhuǎn)儲(chǔ)并打印輸出該路徑,返回true*/
        return true;
      }
      Else/*如果不是,繼續(xù)尋路*/
      {
        nNode = cNode.getRelationNodes().get(i);/*從與當(dāng)前起始節(jié)點(diǎn)cNode有連接關(guān)系的節(jié)點(diǎn)集中按順序遍歷得到一個(gè)節(jié)點(diǎn)作為下一次遞歸尋路時(shí)的起始節(jié)點(diǎn)*/
        while(nNode != null)
        {
          if(pNode != null && (nNode == sNode 
              || nNode == pNode 
              || isNodeInStack(nNode)))/*如果nNode是最初的起始節(jié)點(diǎn)或者nNode就是cNode的上一節(jié)點(diǎn)或者nNode已經(jīng)在棧中,說明產(chǎn)生環(huán)路,應(yīng)重新在與當(dāng)前起始節(jié)點(diǎn)有連接關(guān)系的節(jié)點(diǎn)集中尋找nNode*/
          {
            i++;
            if(i>=cNode.getRelationNodes().size())
              nNode = null;
            else
              nNode = cNode.getRelationNodes().get(i);
            continue;
          }
/*以nNode為新的起始節(jié)點(diǎn),當(dāng)前起始節(jié)點(diǎn)cNode為上一節(jié)點(diǎn),遞歸調(diào)用尋路方法*/
          if(getPaths(nNode, cNode, sNode, eNode))/*遞歸調(diào)用*/
          {
            stack.pop();/*如果找到一條路徑,則彈出棧頂節(jié)點(diǎn)*/
          }
          i++;/*繼續(xù)在與cNode有連接關(guān)系的節(jié)點(diǎn)集中測試nNode*/
          if(i>=cNode.getRelationNodes().size())
            nNode = null;
          else
            nNode = cNode.getRelationNodes().get(i);
        }
        stack.pop();/*當(dāng)遍歷完所有與cNode有連接關(guān)系的節(jié)點(diǎn)后,說明在以cNode為起始節(jié)點(diǎn)到終點(diǎn)的路徑已經(jīng)全部找到*/
        return false;
      }
    }
    else
      return false;
}

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot自動(dòng)重啟的簡單方法

    springboot自動(dòng)重啟的簡單方法

    Springboot提供了熱部署的方式,當(dāng)發(fā)現(xiàn)任何類發(fā)生了改變,馬上通過JVM類加載的方式,加載最新的類到虛擬機(jī)中。這篇文章主要介紹了springboot自動(dòng)重啟的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2018-04-04
  • Java設(shè)計(jì)模式之備忘錄模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院

    Java設(shè)計(jì)模式之備忘錄模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院

    我們?cè)诰幊痰臅r(shí)候,經(jīng)常需要保存對(duì)象的中間狀態(tài),當(dāng)需要的時(shí)候,可以恢復(fù)到這個(gè)狀態(tài)。接下來通過本文給大家分享java設(shè)計(jì)模式之備忘錄模式,感興趣的的朋友一起看看吧
    2017-08-08
  • 使用ftpClient下載ftp上所有文件解析

    使用ftpClient下載ftp上所有文件解析

    最近項(xiàng)目需要寫個(gè)小功能,需求就是實(shí)時(shí)下載ftp指定文件夾下的所有文件(包括子目錄)到本地文件夾中,保留文件到目錄路徑不變。今天小編給大家分享使用ftpClient下載ftp上所有文件的方法,需要的的朋友參考下吧
    2017-04-04
  • JAVA中實(shí)現(xiàn)原生的 socket 通信機(jī)制原理

    JAVA中實(shí)現(xiàn)原生的 socket 通信機(jī)制原理

    本篇文章主要介紹了JAVA中實(shí)現(xiàn)原生的 socket 通信機(jī)制原理,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • 使用mybatisplus接收mysql字段為json類型的數(shù)據(jù)方式

    使用mybatisplus接收mysql字段為json類型的數(shù)據(jù)方式

    這篇文章主要介紹了使用mybatisplus接收mysql字段為json類型的數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 詳解SpringCloud新一代網(wǎng)關(guān)Gateway

    詳解SpringCloud新一代網(wǎng)關(guān)Gateway

    SpringCloud Gateway是Spring Cloud的一個(gè)全新項(xiàng)目,Spring 5.0+ Spring Boot 2.0和Project Reactor等技術(shù)開發(fā)的網(wǎng)關(guān),它旨在為微服務(wù)架構(gòu)提供一種簡單有效的統(tǒng)一的API路由管理方式
    2021-06-06
  • java數(shù)組、泛型、集合在多態(tài)中的使用及對(duì)比

    java數(shù)組、泛型、集合在多態(tài)中的使用及對(duì)比

    本文主要介紹了java數(shù)組、泛型、集合在多態(tài)中的使用及對(duì)比。具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-03-03
  • Spring Boot和Vue跨域請(qǐng)求問題原理解析

    Spring Boot和Vue跨域請(qǐng)求問題原理解析

    這篇文章主要介紹了Spring Boot和Vue跨域請(qǐng)求問題原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 淺談Spring boot cache使用和原理

    淺談Spring boot cache使用和原理

    這篇文章主要介紹了淺談Spring boot cache使用和原理,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-09-09
  • java中的實(shí)體類時(shí)間格式化

    java中的實(shí)體類時(shí)間格式化

    這篇文章主要介紹了java中的實(shí)體類時(shí)間格式化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評(píng)論