Java--算法--图
时间:2021-07-17
本文章向大家介绍Java--算法--图,主要包括Java--算法--图使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
- 图的基本介绍:
-
图的代码实现:
-
package com.model.graph; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * @Description:测试类 * @Author: 张紫韩 * @Crete 2021/7/17 15:16 * 演示图的实现,图的快速入门 */ public class GraphDemo01 { public static void main(String[] args) { Graph graph = new Graph(5); graph.insertVertex("A"); graph.insertVertex("B"); graph.insertVertex("C"); graph.insertVertex("D"); graph.insertVertex("E"); graph.addEdges(0, 1, 1); graph.addEdges(0, 2, 1); graph.addEdges(1, 2, 1); graph.addEdges(1, 3, 1); graph.addEdges(1, 4, 1); graph.showGraph(); } } class Graph{ private List<String> vertexList=null;//保存节点的list private int[][] edges=null;//保存边的矩阵 private int numEdges=0;//边的数目 public Graph(int n) { vertexList=new ArrayList<>(n); edges=new int[n][n]; numEdges=0; } // 保存节点的值,第一个节点的名字 public void insertVertex(String vertex){ vertexList.add(vertex); } // 添加边 public void addEdges(int v1,int v2,int weight){ edges[v1][v2]=weight; edges[v2][v1]=weight; numEdges++; } public int getNumOfVertex(){ return vertexList.size(); } public int getNumEdges(){ return numEdges; } // 返回节点的值,名字 public String getVertex(int index){ return vertexList.get(index); } public int getWeight(int v1,int v2){ return edges[v1][v2]; } public void showGraph(){ for (int[] arr:edges){ System.out.println(Arrays.toString(arr)); } } }
-
图的遍历-深度优先(DFS):
-
public void dfs(){ for (int i = 0; i < getNumEdges(); i++) { if (!isVisited[i]){ dfs(isVisited, i); } } } // 深度优先算法 private void dfs(boolean[] isVisited, int index) { isVisited[index] = true; System.out.print(vertexList.get(index)+"->"); int neighbor = getFirstNeighbor(index); while (neighbor != -1) { if (!isVisited[neighbor]) { dfs(isVisited, neighbor); } neighbor = getNextNeighbor(index, neighbor); } }
-
图的遍历-广度优先算法(BFS):
-
// 广度优先遍历算法 public void bfs(){ isVisited = new boolean[getNumOfVertex()]; for (int i = 0; i < isVisited.length; i++) { if (!isVisited[i]){ bfs(isVisited,i); } } } // 广度优先遍历算法 public void bfs(boolean[] isVisited, int index){ int u; //队列的头节点的小标 int w;//邻接节点 LinkedList queue=new LinkedList();//记录节点的访问顺序 System.out.print(getVertex(index)+"->"); isVisited[index]=true; queue.addLast(index); while(!queue.isEmpty()){ u= (int) queue.removeFirst(); w=getFirstNeighbor(u); while (w!=-1){ if (!isVisited[w]){ System.out.print(getVertex(w)+"->"); isVisited[w]=true; queue.addLast(w); }else { w=getNextNeighbor(u, w); } } } }
- 深度优先算法和广度优先算法的比较;
-
Graph graph1 = new Graph(8); graph1.insertVertex("1"); graph1.insertVertex("2"); graph1.insertVertex("3"); graph1.insertVertex("4"); graph1.insertVertex("5"); graph1.insertVertex("6"); graph1.insertVertex("7"); graph1.insertVertex("8"); graph1.addEdges(0, 1, 1); graph1.addEdges(0, 2, 1); graph1.addEdges(1, 3, 1); graph1.addEdges(1, 4, 1); graph1.addEdges(3, 7, 1); graph1.addEdges(4, 7, 1); graph1.addEdges(2, 5, 1); graph1.addEdges(2, 6, 1); graph1.addEdges(5, 6, 1); graph1.showGraph(); System.out.println("深度优先算法"); graph1.dfs(); System.out.println(); System.out.println("广度优先算法"); graph1.bfs();
-
原文地址:https://www.cnblogs.com/zzhAylm/p/15023002.html
- 并发编程之future模式
- Html5模拟通讯录人员排序(sen.js)
- Goroutine + Channel 实践
- Http和Https的区别
- JavaScript实现单击全选 ,再次点击取消全选
- 连AI都在看《英雄联盟》游戏直播
- MAC使用adb工具
- 并发编程之master-worker模式
- Android WebView全面总结
- Url参数中出现+、空格、=、%、&、#等字符的解决办法
- 解决CSS垂直居中的几种方法(基于绝对定位,基于视口单位,Flexbox方法)
- Go语言学习之cgo(golang与C语言相互调用)
- golang之旅--数据类型之字符串
- Android保存图片到系统图库
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释