亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java計算圖兩點(diǎn)之間的所有路徑

 更新時間:2019年01月17日 09:12:52   作者:xqhadoop  
這篇文章主要為大家詳細(xì)介紹了java計算圖兩點(diǎn)之間的所有路徑,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了java計算圖兩點(diǎn)之間的所有路徑的具體代碼,供大家參考,具體內(nèi)容如下

1.給定圖如下:

2.求0到3之間可達(dá)的所有路徑

這里問題就是關(guān)于搜索遍歷的問題,但其中需要注意到不能產(chǎn)生回路或環(huán).

算法描述如下:

top_node:當(dāng)前棧頂元素

adjvex_node;當(dāng)前top_node已經(jīng)訪問的鄰接點(diǎn)

next_node:即將訪問的元素(top_node的第adjvex_node個鄰接點(diǎn)所對應(yīng)的元素)

找出所有路徑采用的是遍歷的方法,以“深度優(yōu)先”算法為基礎(chǔ)。從源點(diǎn)出發(fā),先到源點(diǎn)的第一個鄰接點(diǎn)N00,再到N00的第一個鄰接點(diǎn)N10,再到N10的第一個鄰接點(diǎn)N20...當(dāng)遍歷到目標(biāo)點(diǎn)時表明找到一條路徑。

上述代碼的核心數(shù)據(jù)結(jié)構(gòu)為一個棧,主要步驟:

①源點(diǎn)先入棧,并進(jìn)行標(biāo)記

②獲取棧頂元素top_node,如果棧頂為終點(diǎn)時,即找到一條路徑,棧頂元素top_node出棧,此時adjvex_node=top_node,新的棧頂元素為top_node,否則執(zhí)行③

③從top_node的所有鄰接點(diǎn)中,從adjvex_node為起點(diǎn),選取下一個鄰接點(diǎn)next_node;如果該元素非空,則入棧,使得adjvex_node=-1,(adjvex_node=-1代表top_node的鄰接點(diǎn)一個還沒有訪問)做入棧標(biāo)記。否則代表沒有后續(xù)節(jié)點(diǎn)了,此時必須出棧棧頂元素,并置adjvex_node為該棧頂元素,并做出棧標(biāo)記。

④為避免回路,已入棧元素要記錄,選取新入棧頂點(diǎn)時應(yīng)跳過已入棧的頂點(diǎn),當(dāng)棧為空時,遍歷完成

3.java代碼實(shí)現(xiàn)

1)圖結(jié)構(gòu)

點(diǎn)表

public class Vertex {
//存放點(diǎn)信息
public int data;
//與該點(diǎn)鄰接的第一個邊節(jié)點(diǎn)
public Edge firstEdge;
}

邊表(代表與點(diǎn)相連的點(diǎn)的集合)

//邊節(jié)點(diǎn)
public class Edge {
//對應(yīng)的點(diǎn)下表
public int vertexId;
//邊的權(quán)重
public int weight;
//下一個邊節(jié)點(diǎn)
public Edge next;
//getter and setter自行補(bǔ)充
}

2).算法實(shí)現(xiàn)

import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
public class graph {
public Vertex[] vertexList; //存放點(diǎn)的集合
public graph(int vertexNum){
 this.vertexNum=vertexNum;
 vertexList=new Vertex[vertexNum];
}
//點(diǎn)個數(shù)
public int vertexNum;
//邊個數(shù)
public int edgeLength;
public void initVertext(int datas[]){
 for(int i=0;i<vertexNum;i++){
 Vertex vertext=new Vertex();
 vertext.data=datas[i];
 vertext.firstEdge=null;
 vertexList[i]=vertext;
 //System.out.println("i"+vertexList[i]);
 }
 isVisited=new boolean[vertexNum];
 for(int i=0;i<isVisited.length;i++){
 isVisited[i]=false;
 }
}
//針對x節(jié)點(diǎn)添加邊節(jié)點(diǎn)y
public void addEdge(int x,int y,int weight){
 Edge edge=new Edge();
 edge.setVertexId(y);
 edge.setWeight(weight);
 //第一個邊節(jié)點(diǎn)
 System.out.println(vertexList.length);
 if(null==vertexList[x].firstEdge){
 vertexList[x].firstEdge=edge;
 edge.setNext(null);
 }
 //不是第一個邊節(jié)點(diǎn),則采用頭插法
 else{
 edge.next=vertexList[x].firstEdge;
 vertexList[x].firstEdge=edge;
 }
}
//得到x的鄰接點(diǎn)為y的后一個鄰接點(diǎn)位置,為-1說明沒有找到
public int getNextNode(int x,int y){
 int next_node=-1;
 Edge edge=vertexList[x].firstEdge;
 if(null!=edge&&y==-1){
 int n=edge.vertexId;
 //元素還不在stack中
 if(!states.get(n))
  return n;
 return -1;
 }
 
 while(null!=edge){
 //節(jié)點(diǎn)未訪問
 if(edge.vertexId==y){
  if(null!=edge.next){
   next_node=edge.next.vertexId;
  if(!states.get(next_node))
  return next_node;
  }
  else
  return -1;
 }
 edge=edge.next;
 }
 return -1;
}
//代表某節(jié)點(diǎn)是否在stack中,避免產(chǎn)生回路
public Map<Integer,Boolean> states=new HashMap();
 
//存放放入stack中的節(jié)點(diǎn)
public Stack<Integer> stack=new Stack();
 
//輸出2個節(jié)點(diǎn)之間的輸出路徑
public void visit(int x,int y){
    //初始化所有節(jié)點(diǎn)在stack中的情況
    for(int i=0;i<vertexNum;i++){
 states.put(i,false);
 }
    //stack top元素
    int top_node;
 //存放當(dāng)前top元素已經(jīng)訪問過的鄰接點(diǎn),若不存在則置-1,此時代表訪問該top元素的第一個鄰接點(diǎn)
    int adjvex_node=-1;
 int next_node;
 stack.add(x);
 states.put(x,true);
 while(!stack.isEmpty()){
 top_node=stack.peek();
 //找到需要訪問的節(jié)點(diǎn)
        if(top_node==y){
  //打印該路徑
  printPath();
  adjvex_node=stack.pop();
  states.put(adjvex_node,false);
 }
 else{
  //訪問top_node的第advex_node個鄰接點(diǎn)
            next_node=getNextNode(top_node,adjvex_node);
  if(next_node!=-1){
  stack.push(next_node);
  //置當(dāng)前節(jié)點(diǎn)訪問狀態(tài)為已在stack中
                states.put(next_node,true);
  //臨接點(diǎn)重置
                adjvex_node=-1;
  }
            //不存在臨接點(diǎn),將stack top元素退出 
            else{
  //當(dāng)前已經(jīng)訪問過了top_node的第adjvex_node鄰接點(diǎn)
                adjvex_node=stack.pop();
  //不在stack中
  states.put(adjvex_node,false);
  }
 }
 }
}
 
//打印stack中信息,即路徑信息
 public void printPath(){
 StringBuilder sb=new StringBuilder();
 for(Integer i :stack){
 sb.append(i+"->");
 }
 sb.delete(sb.length()-2,sb.length());
 System.out.println(sb.toString());
}
 
public static void main(String[]args){
 graph g=new graph(5);
 g.initVertext(new int[]{1,2,3,4,4});
 //System.out.println(g.vertexList[0]);
 g.addEdge(0,1,1);
 g.addEdge(0,2,3);
 g.addEdge(0,3,4);
 g.addEdge(1,2,1);
 g.addEdge(2,0,1);
 g.addEdge(2,3,1);
 g.addEdge(1,3,2);
 g.visit(0,3);
}
}

執(zhí)行結(jié)果如下:

0->3
0->2->3
0->1->2->3 

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

相關(guān)文章

  • Java 生成PDF文檔的示例代碼

    Java 生成PDF文檔的示例代碼

    這篇文章主要介紹了Java 生成PDF文檔的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • GC調(diào)優(yōu)實(shí)戰(zhàn)之高分配速率High?Allocation?Rate

    GC調(diào)優(yōu)實(shí)戰(zhàn)之高分配速率High?Allocation?Rate

    這篇文章主要為大家介紹了GC調(diào)優(yōu)之高分配速率High?Allocation?Rate的實(shí)戰(zhàn)示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-01-01
  • Java判斷兩個集合是否具有交集及如何獲得交集詳解

    Java判斷兩個集合是否具有交集及如何獲得交集詳解

    這篇文章主要給大家介紹了關(guān)于Java判斷兩個集合是否具有交集及如何獲得交集的相關(guān)資料,文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • Java應(yīng)用程序的CPU使用率飆升原因詳細(xì)分析

    Java應(yīng)用程序的CPU使用率飆升原因詳細(xì)分析

    這篇文章主要介紹了Java應(yīng)用程序的CPU使用率飆升原因詳細(xì)分析,在 Java 中,我們使用 JVM 進(jìn)行線程調(diào)度,所以一般來說,線程的調(diào)度有兩種模式:分時調(diào)度和搶占式調(diào)度,線程和進(jìn)程在阻塞或者等待時,都不會使用 CPU 資源,需要的朋友可以參考下
    2024-01-01
  • java 線程創(chuàng)建多線程詳解

    java 線程創(chuàng)建多線程詳解

    本文主要講解java 線程創(chuàng)建多線程的知識,這里對java線程的創(chuàng)建做了詳細(xì)介紹,并附簡單示例代碼,有興趣的小伙伴可以參考下
    2016-09-09
  • Nacos作為配置中心注冊監(jiān)聽器方法

    Nacos作為配置中心注冊監(jiān)聽器方法

    本文主要討論Nacos作為配置中心時,其中配置內(nèi)容發(fā)生更改時,我們的應(yīng)用程序能夠做的事。一般使用監(jiān)聽器來實(shí)現(xiàn)這步操作,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-02-02
  • Java注解處理器學(xué)習(xí)之編譯時處理的注解詳析

    Java注解處理器學(xué)習(xí)之編譯時處理的注解詳析

    編譯時注解相信對每一個java開發(fā)者來說都不陌生,下面這篇文章主要給大家介紹了關(guān)于Java注解處理器學(xué)習(xí)之編譯時處理的注解的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧
    2018-05-05
  • 淺談log4j的rootLogger及其他坑爹的地方

    淺談log4j的rootLogger及其他坑爹的地方

    這篇文章主要介紹了log4j的rootLogger及其他坑爹的地方,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Admin - SpringBoot + Maven 多啟動環(huán)境配置實(shí)例詳解

    Admin - SpringBoot + Maven 多啟動環(huán)境配置實(shí)例詳解

    這篇文章主要介紹了Admin - SpringBoot + Maven 多啟動環(huán)境配置,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Java開發(fā)環(huán)境配置JDK超詳細(xì)整理(適合新手入門)

    Java開發(fā)環(huán)境配置JDK超詳細(xì)整理(適合新手入門)

    這篇文章主要給大家介紹了關(guān)于Java開發(fā)環(huán)境配置JDK超詳細(xì)整理的相關(guān)資料,非常適合新手入門,JDK是Java語言的軟件開發(fā)工具包,主要用于移動設(shè)備、嵌入式設(shè)備上的java應(yīng)用程序,需要的朋友可以參考下
    2023-11-11

最新評論