Shun 发表于 2021-10-5 20:17:58

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

这篇文章主要为大家详细介绍了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;
boolean[] isvisited = new boolean;

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.data) {
   return i;
}
}
return -1;
}


public void buildgraph(int[] vexs,int[][] edges ) {
int vlen = vexs.length;
int elen = edges.length;
vexsarray = new vexnode;

for(int i=0;i<vlen;i++) {
vexsarray = new vexnode();
vexsarray.data = vexs;
vexsarray.firstedge = null;
}

for(int i=0;i<elen;i++) {

int a = edges;
int b = edges;

int start = getposition(a);
int end = getposition(b);

edgenode edgenode = new edgenode();
edgenode.adjvex = end;

if (vexsarray.firstedge == null) {
vexsarray.firstedge = edgenode;
} else {
linklast(vexsarray.firstedge,edgenode);
}
}
}


public void printgraph() {
for(int i=0;i<vexsarray.length;i++) {
system.out.printf("%d--",vexsarray.data);
edgenode node = vexsarray.firstedge;
while (node!=null) {
system.out.printf("%d(%d)--",node.adjvex,vexsarray.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.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

http://www.zzvips.com/article/175424.html
页: [1]
查看完整版本: java查找图中两点之间所有路径