代码:

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.Set;// 顶点类
class Vertex{String name;// 名称boolean visited;// 是否已访问过public Vertex(String name){this.name=name;this.visited=false;}
}// 图类
public class Graph{// 图private Vertex[] arr;// 顶点数组private int[][] matrix;// 邻接矩阵// 建立图的数据private Set<String> vertexSet;// 包含不重复顶点的集合private Map<String,String[]> connMap;// 包含连接的哈希表// 添加顶点之间的连接关系public void addConn(String from,String[] toArr){if(vertexSet==null){vertexSet=new HashSet<String>();}vertexSet.add(from);for(String to:toArr){vertexSet.add(to);}if(connMap==null){connMap=new LinkedHashMap<String,String[]>();}connMap.put(from, toArr);}// 建立图(即其中的顶点数组和邻接矩阵)public void rebuildGraph(){// 初始化顶点数组List<String> ls=new ArrayList<String>();ls.addAll(vertexSet);Collections.sort(ls);int size=ls.size();arr=new Vertex[size];for(int i=0;i<ls.size();i++){arr[i]=new Vertex(ls.get(i));}// 初始化邻接矩阵matrix=new int[size][size];for(String key:connMap.keySet()){String[] values=connMap.get(key);for(String value:values){int x=findVertexIndex(key);int y=findVertexIndex(value);if(x!=-1 && y!=-1){matrix[x][y]=1;matrix[y][x]=1;}}}}// 在顶点数组里找顶点下标private int findVertexIndex(String name){for(int i=0;i<arr.length;i++){if(name.equals(arr[i].name)){return i;}}return -1;}public void displayMatix(){int n=arr.length;System.out.print("  ");for(int i=0;i<n;i++){System.out.print(arr[i].name+",");}System.out.println();System.out.print("-");for(int i=0;i<n;i++){System.out.print("--");}System.out.println();for(int i=0;i<n;i++){System.out.print(arr[i].name+":");for(int j=0;j<n;j++){System.out.print(matrix[i][j]+",");}System.out.println();}}// 得到两个点之间的路径(深度优先搜索)public String getPath(String from,String to){resetArr();// 初始化int fromIndex=findVertexIndex(from);if(fromIndex==-1){return "找不到顶点:"+from;}int toIndex=findVertexIndex(to);if(toIndex==-1){return "找不到顶点:"+to;}//  用于记住路径的栈Stack<Integer> stack=new Stack<Integer>(Integer.class,arr.length);// 开始寻找arr[fromIndex].visited=true;stack.push(fromIndex);while(stack.isEmpty()==false){int j=getConnVertex(stack.peek());if(j==-1){stack.pop();}else{arr[j].visited=true;stack.push(j);if(arr[j].name.equals(to)){// 找到了
                    StringBuilder sb=new StringBuilder();while(stack.isEmpty()==false){int index=stack.pop();sb.insert(0, arr[index].name+"->");}return sb.substring(0, sb.length()-2);}}}return "不可能从"+from+"到"+to;}// 广度优先搜索public String getPath2(String from,String to){resetArr();// 初始化int fromIndex=findVertexIndex(from);if(fromIndex==-1){return "找不到顶点:"+from;}int toIndex=findVertexIndex(to);if(toIndex==-1){return "找不到顶点:"+to;}// 用于记住路径的队列Queue<Integer> queue=new LinkedList<Integer>();// 开始寻找StringBuilder sb=new StringBuilder();arr[fromIndex].visited=true;queue.add(fromIndex);sb.append(arr[fromIndex].name+"->");int j;while(queue.isEmpty()==false){int i=queue.remove();while((j=getConnVertex(i))!=-1){arr[j].visited=true;sb.append(arr[j].name+"->");queue.add(j);if(arr[j].name.equals(to)){// 找到了return sb.substring(0, sb.length()-2);}}}return "不可能从"+from+"到"+to;}/*** 重置顶点访问情况*/private void resetArr(){int n=arr.length;for(int j=0;j<n;j++){arr[j].visited=false;}}// 取得连接未访问过的顶点private int getConnVertex(int i){int n=arr.length;for(int j=0;j<n;j++){if(matrix[i][j]==1 && arr[j].visited==false){return j;}}return -1;}public static void main(String[] args){Graph g=new Graph();g.addConn("A", new String[]{"B","D"});g.addConn("B", new String[]{"A","C"});g.addConn("C", new String[]{"B","D","E"});g.addConn("D", new String[]{"A","C"});g.addConn("E", new String[]{"C"});g.addConn("F", new String[]{"E","G"});g.addConn("G", new String[]{"F"});g.addConn("H", new String[]{"I","J"});g.addConn("I", new String[]{"H","J"});g.addConn("J", new String[]{"H","I"});g.rebuildGraph();g.displayMatix();String path=g.getPath("A", "G");System.out.println(path);path=g.getPath("A", "H");System.out.println(path);path=g.getPath("J", "H");System.out.println(path);path=g.getPath("F", "B");System.out.println(path);path=g.getPath2("A", "G");System.out.println(path);path=g.getPath2("F", "B");System.out.println(path);}
}

输出:

  A,B,C,D,E,F,G,H,I,J,
---------------------
A:0,1,0,1,0,0,0,0,0,0,
B:1,0,1,0,0,0,0,0,0,0,
C:0,1,0,1,1,0,0,0,0,0,
D:1,0,1,0,0,0,0,0,0,0,
E:0,0,1,0,0,1,0,0,0,0,
F:0,0,0,0,1,0,1,0,0,0,
G:0,0,0,0,0,1,0,0,0,0,
H:0,0,0,0,0,0,0,0,1,1,
I:0,0,0,0,0,0,0,1,0,1,
J:0,0,0,0,0,0,0,1,1,0,
A->B->C->E->F->G
不可能从A到H
J->H
F->E->C->B
A->B->D->C->E->F->G
F->E->G->C->B

顶点示意图:

转载于:https://www.cnblogs.com/xiandedanteng/p/3885477.html

爪哇国新游记之二十五----图及其遍历查找相关推荐

  1. 爪哇国新游记之二十六----迷宫寻路

    代码: class Position{int x;int y;public Position(int x,int y){this.x=x;this.y=y;} } // 迷宫寻路 public cla ...

  2. 爪哇国新游记之二十四----二叉树

    /*** 二叉树节点类* */ class Node<T extends Comparable> {public Node(T data){this.data=data;}T data;N ...

  3. 爪哇国新游记之二十八----从url指定的地址下载文件到本地

    package download;import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; i ...

  4. 爪哇国新游记之二十九----访问URL获取输入流

    代码: import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import ...

  5. 爪哇国新游记之二十一----快算24

    四张牌,通过四则运算得到24,一个数限用一次,快者为胜. 代码: import java.util.ArrayList; import java.util.HashSet; import java.u ...

  6. 爪哇国新游记之十五----泛型动态数组类

    import java.lang.reflect.Array;/*** 泛型动态数组类**/ public class DynamicArray<T extends Object>{pri ...

  7. 爪哇国新游记之三十二----邮件发送

    由三个类完成任务,第一个为主,main中是用法示例. 纯邮件发送和带附件发送邮件皆可,大家请参照main函数中用法. package com.ufo.util.mail;import java.uti ...

  8. 爪哇国新游记之三十----十九个正则表达式示例

    1.重复次数匹配 代码: String[] dataArr = { "moon", "mon", "moon", "mono&qu ...

  9. 爪哇国新游记之十八----泛型栈类

    import java.lang.reflect.Array;/*** 泛型栈** @param <T>*/ public class Stack<T>{private Cla ...

最新文章

  1. 安卓高手之路之 WindowManager
  2. 塞内加尔将于5月启用全国首个大型数据中心
  3. 【PAT】B1048 数字加密
  4. mysql jdbc 驱动 下载地址官网
  5. python课设带报告_20192423 2019-2020-2 《Python程序设计》实验三报告
  6. 拓端tecdat|数据告诉你:互联网哪个职位最有前途?
  7. python基础之socket
  8. 花了3个月,濒临崩溃的K8S集群有救了……
  9. udhcpc 和 udhcpd
  10. servlet容器,web容器,spring容器,springmvc容器,dubbo容器之间区别
  11. ios 应用和电脑共享文件夹_无需软件,在ios和Win之间实现高速文件共享
  12. Microbiome:肠易激综合征的认知行为疗法诱导与胃肠道症状改善相关的脑-肠-微生物组轴的改变
  13. EV,PV,AC,SPI,CPI中曲线对比图
  14. 使用Python来操作邮箱
  15. 酷我音乐linux版本,酷我音乐盒的 Gtk/Linux 实现 – v2.5 版本发布
  16. 使用js转换数据库时间类型
  17. (01)ORB-SLAM2源码无死角解析-(62) BA优化(g2o)→追踪线程:Optimizer::PoseOptimization→仅位姿优化
  18. 如何轻松搭建一个在线wiki文档平台?
  19. 软件架构哲学:和而不同、知行合一、大道自然
  20. Codeforces Beta Round #7

热门文章

  1. 字符串生成条码(CODE128),并实现在水晶报表上的条码打印!
  2. 40个常见的HTML5 面试问题及答案
  3. Unity3D项目升级URP
  4. 【超简单】利用Python去除图片水印,太神奇了叭,你还不会嘛?(附三种方法)
  5. 您的计算机和打印机上的打印纸设置不匹配,打印纸张不符合打印要求、类型与设置不符-打印机上门维修复印机...
  6. 北大韦神等十人获奖,均分1000万元,达摩院2021青橙奖出炉
  7. 比较精确的计算农历节气的java源码
  8. 哈尔滨工业大学计算机考研专业课,2020考研哈尔滨工业大学计算机考研考试科目...
  9. 英文文献翻译格式整理器
  10. emoji表情在数据库中如何查询