java查找图中两点之间所有路径

 更新时间:2019年01月17日 09:31:20   作者:Coder_py  
这篇文章主要为大家详细介绍了java查找图中两点之间所有路径,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了java查找图中两点之间所有路径的具体代码,基于邻接表,供大家参考,具体内容如下

图类:

package graph1;
 
import java.util.LinkedList;
 
import graph.Graph.edgeNode;
 
public class Graph {
 
 class EdgeNode{
  int adjvex;
  EdgeNode nextEdge;
 }
 
 class VexNode{
 int data;
 EdgeNode firstEdge;
 boolean isVisted;
 public boolean isVisted() {
  return isVisted;
 }
 public void setVisted(boolean isVisted) {
  this.isVisted = isVisted;
 }
 
 }
 
 VexNode[] vexsarray ;
 int[] visited = new int[100];
 boolean[] isVisited = new boolean[100];
 
 public void linkLast(EdgeNode target,EdgeNode node) {
 while (target.nextEdge!=null) {
  target=target.nextEdge;
 }
 target.nextEdge=node;
 }
 
 public int getPosition(int data) {
  for(int i=0;i<vexsarray.length;i++) {
  if (data==vexsarray[i].data) {
   return i;
  }
  }
  return -1;
 }
 
 
 public void buildGraph(int[] vexs,int[][] edges ) {
 int vLen = vexs.length;
 int eLen = edges.length;
 vexsarray = new VexNode[vLen];
 
 for(int i=0;i<vLen;i++) {
  vexsarray[i] = new VexNode();
  vexsarray[i].data = vexs[i];
  vexsarray[i].firstEdge = null;
 }
 
 for(int i=0;i<eLen;i++) {
  
  int a = edges[i][0];
  int b = edges[i][1];
  
  int start = getPosition(a);
  int end = getPosition(b);
  
  EdgeNode edgeNode = new EdgeNode();
  edgeNode.adjvex = end;
  
  if (vexsarray[start].firstEdge == null) {
  vexsarray[start].firstEdge = edgeNode;
  } else {
  linkLast(vexsarray[start].firstEdge,edgeNode);
  }
 }
 }
 
 
 public void printGraph() {
 for(int i=0;i<vexsarray.length;i++) {
  System.out.printf("%d--",vexsarray[i].data);
  EdgeNode node = vexsarray[i].firstEdge;
  while (node!=null) {
  System.out.printf("%d(%d)--",node.adjvex,vexsarray[node.adjvex].data);
  node = node.nextEdge;
  }
  System.out.println("\n");
 }
 }

算法:

package graph1;
 
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
 
import javax.swing.plaf.synth.SynthStyle;
 
import graph1.Graph.EdgeNode;
 
public class FindALlPath {
 
 
 //代表某节点是否在stack中,避免产生回路 
 public Map<Integer,Boolean> states=new HashMap(); 
  
 //存放放入stack中的节点 
 public Stack<Integer> stack=new Stack(); 
 
 //打印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()); 
 } 
 
 //得到x的邻接点为y的后一个邻接点位置,为-1说明没有找到 
 public int getNextNode(Graph graph,int x,int y){ 
   int next_node=-1; 
   EdgeNode edge=graph.vexsarray[x].firstEdge; 
   if(null!=edge&&y==-1){ 
     int n=edge.adjvex; 
     //元素还不在stack中 
     if(!states.get(n)) 
       return n; 
     return -1; 
   } 
      
   while(null!=edge){ 
     //节点未访问 
     if(edge.adjvex==y){ 
       if(null!=edge.nextEdge){ 
       next_node=edge.nextEdge.adjvex; 
       
       if(!states.get(next_node)) 
         return next_node; 
       } 
       else 
         return -1; 
     } 
     edge=edge.nextEdge; 
   } 
   return -1; 
 }
 
 
 
 public void visit(Graph graph,int x,int y){ 
    //初始化所有节点在stack中的情况 
     for(int i=0;i<graph.vexsarray.length;i++){ 
     states.put(i,false); 
   } 
     //stack top元素 
     int top_node; 
   //存放当前top元素已经访问过的邻接点,若不存在则置-1,此时代表访问该top元素的第一个邻接点 
     int adjvex_node=-1; 
   int next_node; 
   stack.add(x); 
   states.put(x,true); 
   
   while(!stack.isEmpty()){ 
     top_node=stack.peek(); 
     //找到需要访问的节点 
        if(top_node==y){ 
       //打印该路径 
       printPath(); 
       adjvex_node=stack.pop(); 
       states.put(adjvex_node,false); 
     } 
     else{ 
       //访问top_node的第advex_node个邻接点 
             next_node=getNextNode(graph,top_node,adjvex_node); 
       if(next_node!=-1){ 
         stack.push(next_node); 
         //置当前节点访问状态为已在stack中 
                 states.put(next_node,true); 
         //临接点重置 
                 adjvex_node=-1; 
       } 
            //不存在临接点,将stack top元素退出  
             else{ 
         //当前已经访问过了top_node的第adjvex_node邻接点 
                 adjvex_node=stack.pop(); 
         //不在stack中 
         states.put(adjvex_node,false); 
       } 
     } 
   } 
 } 
 
 
}

测试类:

package graph1;
 
import java.util.Iterator;
 
import graph1.Graph.VexNode;
 
public class Tset2 {
 
 public static void main(String[] args) {
 
 int[] vexs = {0,1,2,3,4};
 int[][] edges = {
  {0,1},
  {0,3},
  {1,0},
  {1,2},
  {2,1},
  {2,3},
  {2,4},
  {3,0},
  {3,2},
  {3,4},
  {4,2},
  {4,3},
  
 };
 Graph graph = new Graph();
 graph.buildGraph(vexs, edges);
 graph.printGraph();
 
 
 FindALlPath findALlPath = new FindALlPath();
 findALlPath.visit(graph, 4, 0);
 
 }
 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Netty分布式ByteBuf中PooledByteBufAllocator剖析

    Netty分布式ByteBuf中PooledByteBufAllocator剖析

    这篇文章主要为大家介绍了Netty分布式ByteBuf剖析PooledByteBufAllocator简述,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • Java实现直接插入排序与折半插入排序的示例详解

    Java实现直接插入排序与折半插入排序的示例详解

    这篇文章主要为大家详细介绍了插入排序中两个常见的排序:直接插入排序与折半插入排序。本文用Java语言实现了这两个排序算法,感兴趣的可以学习一下
    2022-06-06
  • Java实现的基于socket通信的实例代码

    Java实现的基于socket通信的实例代码

    Java实现的基于socket通信的实例代码,需要的朋友可以参考一下
    2013-03-03
  • AsyncHttpClient ListenableFuture源码流程解读

    AsyncHttpClient ListenableFuture源码流程解读

    这篇文章主要为大家介绍了AsyncHttpClient ListenableFuture源码流程解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Java日常练习题,每天进步一点点(43)

    Java日常练习题,每天进步一点点(43)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07
  • 深入解析Java中的JDBC事务

    深入解析Java中的JDBC事务

    这篇文章主要介绍了深入解析Java中的JDBC事务,包含了Java多线程的事务并发等知识,需要的朋友可以参考下
    2015-08-08
  • MybatisPlus条件查询的具体使用

    MybatisPlus条件查询的具体使用

    MybatisPlus通过条件构造器可以组装复杂的查询条件,本文主要介绍了MybatisPlus条件查询的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Java中关于size()>0 和isEmpt()的性能考量

    Java中关于size()>0 和isEmpt()的性能考量

    这篇文章主要介绍了Java中关于size()>0 和isEmpt()性能考量,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • java实现web实时消息推送的七种方案

    java实现web实时消息推送的七种方案

    这篇文章主要为大家介绍了java实现web实时消息推送的七种方案示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • JAVA中简单的for循环异常踩坑

    JAVA中简单的for循环异常踩坑

    这篇文章主要为大家介绍了JAVA中简单的for循环异常踩坑避雷详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07

最新评论