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);

 }

}

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

(0)

相关推荐

  • java查找无向连通图中两点间所有路径的算法

    之前就这个问题发帖求教过,过了几天没看到回复就没再关心.后来自己设计了一个算法,在公司的项目中实践了一下,效果还可以,贴出来供大家参考. 算法要求: 1. 在一个无向连通图中求出两个给定点之间的所有路径: 2. 在所得路径上不能含有环路或重复的点: 算法思想描述: 1. 整理节点间的关系,为每个节点建立一个集合,该集合中保存所有与该节点直接相连的节点(不包括该节点自身): 2. 定义两点一个为起始节点,另一个为终点,求解两者之间的所有路径的问题可以被分解为如下所述的子问题:对每一个与起始节点直接

  • java搜索无向图中两点之间所有路径的算法

    参考 java查找无向连通图中两点间所有路径的算法,对代码进行了部分修改,并编写了测试用例. 算法要求: 1. 在一个无向连通图中求出两个给定点之间的所有路径: 2. 在所得路径上不能含有环路或重复的点: 算法思想描述: 1. 整理节点间的关系,为每个节点建立一个集合,该集合中保存所有与该节点直接相连的节点(不包括该节点自身): 2. 定义两点一个为起始节点,另一个为终点,求解两者之间的所有路径的问题可以被分解为如下所述的子问题:对每一 个与起始节点直接相连的节点,求解它到终点的所有路径(路径上

  • java计算图两点之间的所有路径

    本文实例为大家分享了java计算图两点之间的所有路径的具体代码,供大家参考,具体内容如下 1.给定图如下: 2.求0到3之间可达的所有路径 这里问题就是关于搜索遍历的问题,但其中需要注意到不能产生回路或环. 算法描述如下: top_node:当前栈顶元素 adjvex_node;当前top_node已经访问的邻接点 next_node:即将访问的元素(top_node的第adjvex_node个邻接点所对应的元素) 找出所有路径采用的是遍历的方法,以"深度优先"算法为基础.从源点出发,

  • 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; boolea

  • java查找字符串中的包含子字符串的个数实现代码

    1. 用indexof的方法: public class Test11 { private static int counter = 0; /** * @param args */ public static void main(String[] args) { String str ="sdSS**&HGJhadHCASch& ^^"; int i = stringNumbers(str); System.out.println(i); } public static

  • java 查找list中重复数据实例详解

    java 查找list中重复数据实例详解 需求: 查找一个List集合中所有重复的数据,重复的数据可能不止一堆,比如:aa, bb, aa, bb, cc , dd, aa这样的数据.如果有重复数据,则给这些重复数据加上编号,上述数据改为:aa1, bb1, aa2, bb2, cc, dd. 算法如下: public static void same(List<String> list) { String [] indexArr ; Map<String, String> map

  • Java web开发中加载图片路径的两种方式

    (1)   src="/image/1_it.jpg" (2)   src="http://localhost:8080/image/1_it.jpg" 其中localhost可以换位你的电脑IP,端口号也要相应改变. 以上均在基于编译器idea以及tomcat服务器开发的web中测试可行!都是要先定位到项目的位置! 以上所述是小编给大家介绍的Java web开发加载图片路径的两种方式,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

  • Java查找 List 中的最大最小值实例演示

    以下实例演示了如何使用 Collections 类的 max() 和 min() 方法来获取List中最大最小值: /* author by w3cschool.cc Main.java */ import java.util.*; public class Main { public static void main(String[] args) { List list = Arrays.asList("one Two three Four five six one three Four&qu

  • Java的字符串中对子字符串的查找方法总结

    Java中字符串中子串的查找共有四种方法,如下: 1.int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引. 2.int indexOf(String str, int startIndex):从指定的索引处开始,返回第一次出现的指定子字符串在此字符串中的索引. 3.int lastIndexOf(String str) :返回在此字符串中最右边出现的指定子字符串的索引. 4.int lastIndexOf(String str, int startI

  • Java实现计算图中两个顶点的所有路径

    目录 前言 抽象数据模型 代码实现数据模型 计算两个顶点之间路径算法 总结 前言 最近公司的项目上有个需求,还挺有分享价值的,这边做个记录.需求大致如下,下面的一个流程图,点击条件线上选择的内容,必须是前面配置过的节点,如果不是,需要在保存的时候做强校验提示. 需求其实很明确,抽象出来就是获取图中两个顶点之间所有可达路径的顶点集合,大家可以思考下,该如何实现?这里面涉及到了数据结构中图相关知识,而数据结构算法也是本事最大的弱项,还是废了我一番工夫. 抽象数据模型 实际上,看到这个需求就很容易想到

随机推荐