评论

收藏

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

编程语言 编程语言 发布于:2021-10-05 20:17 | 阅读数:493 | 评论:0

这篇文章主要为大家详细介绍了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);
 
 }
 
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持CodeAE代码之家
原文链接:https://blog.csdn.net/Coder_py/article/details/72542898

关注下面的标签,发现更多相似文章