无向图--邻接矩阵、连接矩阵、深度遍历、广度遍历、生成树
package graph; import java.util.ArrayList;import java.util.Iterator;import java.util.LinkedList;import java.util.List;import java.util.Queue;import java.util.Stack; public class GraphTest { public static void main(String[] args) { AdjacencyMatrixGraph a = new AdjacencyMatrixGraph(6); a.addVertex("A"); a.addVertex("B"); a.addVertex("C"); a.addVertex("D"); a.addVertex("E"); a.addVertex("F"); a.addEdge(0, 1); a.addEdge(1, 2); a.addEdge(0, 3); a.addEdge(2, 4); a.addEdge(0, 2); a.addEdge(0, 4); a.addEdge(3, 5); a.printMatrix(); a.traverseDepth(); System.out.println(); a.traverseBroad(); System.out.println(); a.growMinTree(); System.out.println(); a.traverseBroad(); // ConnectionMatrixGraph con = new ConnectionMatrixGraph();// con.addVertex("A");// con.addVertex("B");// con.addVertex("C");// con.addVertex("D");// // con.addEdge(0, 1);// con.addEdge(0, 3);// con.addEdge(1, 2);// con.addEdge(0, 2);// con.addEdge(2, 3);// // con.printConnectionMatrix(); // con.traverseBroad(); }} /** * 采用邻接矩阵的无向图 * @author LiangYH * */class AdjacencyMatrixGraph{ //最大顶点数的容量 private int maxSize; //存放顶点 private List<Vertex> vertexList; //邻接矩阵,存放点和点的关系 private int[][] adjacencyMatrix; public AdjacencyMatrixGraph(int maxSize){ this.maxSize = maxSize; this.vertexList = new ArrayList<Vertex>(); adjacencyMatrix = new int[maxSize][maxSize]; } public boolean isFull(){ return vertexList.size() >= maxSize; } //增加顶点 public void addVertex(String label){ if(isFull()) throw new ArrayIndexOutOfBoundsException("数组已经满了"); vertexList.add(new Vertex(label)); } //增加边 public void addEdge(int vertexIndex1, int vertexIndex2){ int size = getSize(); if(vertexIndex1 >= size || vertexIndex2 >= size) throw new ArrayIndexOutOfBoundsException(); this.adjacencyMatrix[vertexIndex1][vertexIndex2] = 1; this.adjacencyMatrix[vertexIndex2][vertexIndex1] = 1; } /** * 深度优先遍历图 */ public void traverseDepth(){ Stack<Vertex> s = new Stack<>(); System.out.print(vertexList.get(0).getLabel()); vertexList.get(0).setVisited(true); int targetIndex = 0; while(true){ int size = getSize(); for(int i = 0; i < size; i++){ if((!vertexList.get(i).isVisited()) && adjacencyMatrix[targetIndex][i] == 1){ Vertex temp = vertexList.get(i); temp.setVisited(true); System.out.print(vertexList.get(i).getLabel()); s.push(vertexList.get(targetIndex)); targetIndex = i; i = 0; } } if(!s.isEmpty()){ Vertex tempV = s.pop(); targetIndex = findVertex(tempV); }else{ break; } } //恢复 int len = vertexList.size(); for(int i = 0; i < len; i++){ vertexList.get(i).setVisited(false); } } /** * 广度优先遍历图 */ public void traverseBroad(){ Queue<Vertex> q = new LinkedList<>(); //第一个访问的是第一个顶点 System.out.print(vertexList.get(0).getLabel()); vertexList.get(0).setVisited(true); //当前所在的节点 int targetIndex = 0; int size = getSize(); while(true){ for(int i = 0; i < size; i++){ //是否已经被访问过以及是否有边的联系 if((!vertexList.get(i).isVisited()) && adjacencyMatrix[targetIndex][i] == 1){ Vertex t = vertexList.get(i); q.add(t); t.setVisited(true); System.out.print(vertexList.get(i).getLabel()); } } if(!q.isEmpty()){ //从队列中弹出顶点 Vertex tempV = q.poll(); //改变当前所在的节点下标 targetIndex = findVertex(tempV); }else{ break; } } //恢复 int len = vertexList.size(); for(int i = 0; i < len; i++){ vertexList.get(i).setVisited(false); } } private int findVertex(Vertex vertex){ for(int i = 0; i < vertexList.size(); i++){ if(vertex == vertexList.get(i)) return i; } return -1; } public int getSize(){ return this.vertexList.size(); } /** * 最小生成树 * 思路:和上面的深度优先遍历图的方法基本相同,只是下面的method是在遍历的同时记录下了边的关系。 */ public void growMinTree(){ int len2 = vertexList.size(); int[][] tempDyadic = new int[len2][len2]; Stack<Vertex> s = new Stack<>(); System.out.print(vertexList.get(0).getLabel()); vertexList.get(0).setVisited(true); int targetIndex = 0; while(true){ int size = getSize(); for(int i = 0; i < size; i++){ if((!vertexList.get(i).isVisited()) && adjacencyMatrix[targetIndex][i] == 1){ //最小生成树的邻接矩阵的关键:标记访问过并且有链接的连线,放在新的二维数组中 tempDyadic[targetIndex][i] = 1; Vertex temp = vertexList.get(i); temp.setVisited(true); System.out.print(vertexList.get(i).getLabel()); s.push(vertexList.get(targetIndex)); targetIndex = i; i = 0; } } if(!s.isEmpty()){ Vertex tempV = s.pop(); targetIndex = findVertex(tempV); }else{ break; } } //恢复为都未访问过 int len = vertexList.size(); for(int i = 0; i < len; i++){ vertexList.get(i).setVisited(false); } //打印邻接矩阵 System.out.println(); System.out.println("最小生成树的邻接矩阵:"); for(int i = 0; i < len; i++){ for(int k = 0; k < len; k++){ System.out.print(tempDyadic[i][k]+" "); } System.out.println(); } //改变矩阵的引用 adjacencyMatrix = tempDyadic; } public void printMatrix(){ System.out.println("图的邻接矩阵: "); int len = vertexList.size(); for(int i = 0; i < len; i++){ for(int k = 0; k < len; k++){ System.out.print(adjacencyMatrix[i][k]+" "); } System.out.println(); } }} /** * 采用连接矩阵的无向图 * @author admin * */class ConnectionMatrixGraph{// private LinkedList<Vertex> vertexList; private LinkedList<LinkedList<Vertex>> connectionMatrix; public ConnectionMatrixGraph(){// vertexList = new ArrayList<>(); connectionMatrix = new LinkedList<>(); } public void addVertex(String label){ LinkedList<Vertex> v = new LinkedList<Vertex>(); v.add(new Vertex(label)); connectionMatrix.add(v); } public void addEdge(int a, int b){ LinkedList<Vertex> vlist1 = this.connectionMatrix.get(a); LinkedList<Vertex> vlist2 = this.connectionMatrix.get(b); vlist1.add(vlist2.get(0)); vlist2.add(vlist1.get(0)); } /** * 打印链接矩阵 */ public void printConnectionMatrix(){ java.util.Iterator<LinkedList<Vertex>> iter = connectionMatrix.iterator(); while(iter.hasNext()){ LinkedList<Vertex> tempLink = iter.next(); java.util.Iterator<Vertex> iter2 = tempLink.iterator(); while(iter2.hasNext()){ Vertex v = iter2.next(); System.out.print(v.getLabel()+"-->"); } System.out.println(); } } /** * 图的广度优先遍历,不需栈 */ public void traverseBroad(){ Iterator<LinkedList<Vertex>> iter = null; iter = connectionMatrix.iterator(); while(iter.hasNext()){ LinkedList<Vertex> tempLink = iter.next(); Iterator<Vertex> iter2 = null; iter2 = tempLink.iterator(); Vertex tempV2 = null; if(iter2.hasNext()){ tempV2 = iter2.next(); //如果没有访问过 if(!tempV2.isVisited()){ tempV2.setVisited(true); System.out.print(tempV2.getLabel()); } }else{ continue; } while(iter2.hasNext()){ Vertex tempV = iter2.next(); if(!tempV.isVisited()){ tempV.setVisited(true); System.out.print(tempV.getLabel()); } } } } } /** * 顶点 * @author admin * */class Vertex{ private String label; private boolean isVisited; public Vertex(String label){ this.label = label; this.isVisited = false; } public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } public boolean isVisited() { return isVisited; } public void setVisited(boolean isVisited) { this.isVisited = isVisited; } }
无向图--邻接矩阵、连接矩阵、深度遍历、广度遍历、生成树相关推荐
- 数据结构【图】—022邻接矩阵的深度和广度遍历
1 #include "000库函数.h" 2 //无向图 3 4 typedef char VertexType; /* 顶点类型应由用户定义 */ 5 typedef int ...
- 数据结构 - 图的基本操作 深度和广度遍历
##代码实现 ###main.cpp(主函数) #include <iostream> #include "CMap.h" using namespace std;/* ...
- 数据结构【图】—023邻接表深度和广度遍历
1 #include "000库函数.h" 2 //无向图 3 4 #define MAXSIZE 9 /* 存储空间初始分配量 */ 5 #define MAXEDGE 15 6 ...
- 二叉树层次遍历--广度遍历和深度遍历
问题来源:二叉树层次遍历 问题描述:给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例子: 给定二叉树: [3,9,20,null,null,15,7], 3/ \9 ...
- 树与树算法二叉树的层次遍历/广度遍历/深度遍历详解与代码实现
一. 树与树算法 1.1树的概念 树(tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合.它是由n(n>=1)个有限节点组成一个具有 ...
- 有向图的深度和广度遍历
题目要求: 1.对于下图所示的有向图(访问顺序按序号从小到大),试写出: (1) 从顶点①出发进行深度优先搜索所得到的深度优先生成树: (2) 从顶点②出发进行广度优先搜索所得到的广度优先生成树. p ...
- 图 邻接表 建立 深度遍历 广度遍历
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 图的邻接 ...
- js实现深度遍历与广度遍历
题目:省份数量 有 n 个城市,其中一些彼此相连,另一些没有相连.如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连. 省份 是一组直接或间接相连 ...
- js中树形结构的深度遍历与广度遍历
树形结构的深度遍历与广度遍历 定义 深度遍历:一个树形结构中,由一个数据分支全部遍历完才去遍历另外一个分支,直至全部数据遍历完成. 广度遍历:先遍历最外层的分支数据,然后一层一层的进行深入遍历,直至全 ...
最新文章
- C++对象模型9——临时对象的生命周期、模板及实例化分析、内联函数
- [BZOJ 4800][Ceoi2015]Ice Hockey World Championship(Meet-in-the-Middle)
- Chrome浏览器不支持字体小于12px的解决办法
- [architecture]-ARMV8的RAS Extension(Reliability、Availability、Serviceability)介绍
- TransactionScope只要一个操作失败,它会自动回滚,Complete表示事务完成
- pd 生成mysql语句_PDMan + Navicat Premium + MySQL 数据库设计和工具
- mysql复制功能介绍
- java hibernate的使用_《Hibernate快速开始 – 4 – 使用JAVA持久层 API (JPA)教程》
- html 树形图可拖拽,HTML5拖拽API实现vue树形拖拽组件
- Android中文API-ViewStub
- 超有用的方法-----英语单词记忆篇
- extract 模板 php,PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例...
- python 基础学习--运算符集合
- linux下安装svn1.7
- 2021年中国电动扫地机市场趋势报告、技术动态创新及2027年市场预测
- 基于java在线问卷调查系统
- layabox 学习笔记
- python爬取豆瓣Top250-改进版
- java libmp3lame_利用libmp3lame实现在Android上录音MP3文件示例
- Python 贪心法:真分数表示为埃及分数之和
热门文章
- 【物联网智能网关-14】Html5:Canvas+WebSocket实现远程实时通信(下)
- C# EF 基础操作
- Html5 Json应用
- MYSQL主从数据库搭建
- cocos2d-x 3.0 Loading界面实现
- Python实现线程池
- C语言库函数大全及应用实例二
- gcc编译器和mysql源码哪个难_源码编译mysql 5.5
- python元素定位的八种方法_selenium webdriver基于Python系列之八种元素定位方法
- 腾讯面试题:创建索引时,你会怎么考虑呢?(看完你就能和面试官谈人生了)