服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|JavaScript|易语言|

服务器之家 - 编程语言 - Java教程 - java查找图中两点之间所有路径

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

2021-07-09 16:58Coder_py Java教程

这篇文章主要为大家详细介绍了java查找图中两点之间所有路径,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

图类:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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");
 }
 }

算法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
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);
       }
     }
   }
 }
 
 
}

测试类:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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);
 
 }
 
}

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

原文链接:https://blog.csdn.net/Coder_py/article/details/72542898

延伸 · 阅读

精彩推荐
  • Java教程Java面向对象编程之类的继承详解

    Java面向对象编程之类的继承详解

    这篇文章主要介绍了Java面向对象编程之类的继承,结合实例形式较为详细的分析了Java面向对象编程类的概念、功能、使用方法及相关注意事项,需要的朋友可...

    毕加索的ma9062021-03-30
  • Java教程SpringBoot加载静态资源的方式

    SpringBoot加载静态资源的方式

    本篇文章主要介绍了SpringBoot加载静态资源的方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    木叶之荣5012020-09-09
  • Java教程Java计算黑洞数的方法示例

    Java计算黑洞数的方法示例

    这篇文章主要介绍了Java计算黑洞数的方法,简单描述了黑洞数的概念及具体计算方法,涉及java数值运算相关操作技巧,需要的朋友可以参考下...

    xxiaowen7522021-03-08
  • Java教程Spring 事务事件监控及实现原理解析

    Spring 事务事件监控及实现原理解析

    本文首先会使用实例进行讲解Spring事务事件是如何使用的,然后会讲解这种使用方式的实现原理。感兴趣的朋友跟随小编一起看看吧...

    爱宝贝丶10592021-06-01
  • Java教程Java基本数据类型与对应的包装类(动力节点java学院整理)

    Java基本数据类型与对应的包装类(动力节点java学院整理)

    Java是面向对象的编程语言,包装类的出现更好的体现这一思想,Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型...

    Java教程网4082020-09-09
  • Java教程Java接口RandomAccess全面了解

    Java接口RandomAccess全面了解

    下面小编就为大家带来一篇Java接口RandomAccess全面了解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...

    jingxian4472020-06-12
  • Java教程java 代理机制的实例详解

    java 代理机制的实例详解

    这篇文章主要介绍了java 代理机制的实例详解的相关资料,这里说明下如何实现代理机制,帮助大家理解掌握这部分内容,需要的朋友可以参考下...

    sheungxin2432020-12-20
  • Java教程java使用dom4j解析xml配置文件实现抽象工厂反射示例

    java使用dom4j解析xml配置文件实现抽象工厂反射示例

    本文主要介绍了java使用dom4j读取配置文件实现抽象工厂和反射的示例,在Java中也可以同Donet一样,将差异配置在配置文件里面。另外,我们采用下面的方式...

    java技术网2892019-10-27