运用遍历判断无向图(网)是否连通

2023-11-09

基本思路:

使用广度优先遍历方法,任选一个结点开始遍历,遍历结束后每个结点都访问到了即为连通。

主代码:

判断是否连通的isConnected()方法在最末尾。

import dataStructure.linearList.LinkQueue;

public class ALGraph<E> implements
IGraph<E> {
       private GraphKind kind;             //图的类型
       private int vexNum;                    //图中顶点数
       private int arcNum;                    //图中边(弧)数
       private VNode<E> vexs[];    //图的顶点结点数组

       public ALGraph() {
              this(null,0,0,null);
       }
       public ALGraph(GraphKind kind, int vexNum, int arcNum, VNode<E>[] vexs) {
              this.kind = kind;
              this.vexNum = vexNum;
              this.arcNum = arcNum;
              this.vexs = vexs;
       }
       public GraphKind getKind() {
              return kind;
       }
       public int getVexNum() {
              return vexNum;
       }

       public int getArcNum() {
              return arcNum;
       }

       public VNode<E>[] getVexs() {
            return vexs;
       }

       //获取顶点位置序号为v的顶点的数据
       public E getVex(int v) throws Exception {
              if (v < 0 || v >= vexNum)
                    throw new Exception("第" + v + "个顶点不存在!");
              return vexs[v].getData();
       }
      
	//获取顶点数据为vex的顶点的位序号
       public int locateVex(E vex) {
              for (int i = 0; i < vexNum; i++)
                     if (vexs[i].getData().equals(vex))
                            return i; 
              return -1;  
       }      
       
       //获取位置序号为v的顶点的第一个邻接边对应的邻接点的位序号
       public int firstAdjVex(int v) throws Exception {     
 	  if (v < 0 || v >= vexNum)
                throw new Exception("第" + v + "个顶点不存在!");
          if (vexs[v].getFirstArc() != null)  //它一条关联的边(或者有向图一条出边都没有)的话,空对象不能调用getAdjVex()方法,会报错
                return vexs[v].getFirstArc().getAdjVex();
          else
               return -1;
       }

       //获取位置序号为v的顶点的位序号为w的邻接点的下一个邻接点
       public int nextAdjVex(int v, int w) throws Exception {     
  	   if (v < 0 || v >= vexNum)
      		throw new Exception("第" + v + "个顶点不存在!");
           ArcNode arcVW = null;
           ArcNode arc = vexs[v].getFirstArc();
           while(arc != null)  {
                  if(arc.getAdjVex() == w) {
                         arcVW = arc;
                         break;
                  }
                  else
                         arc = arc.getNextArc();
              }            
           if (arcVW != null && arcVW.getNextArc() != null)
            	return arcVW.getNextArc().getAdjVex();
           else
                return -1;      
       }
     
       //获取起始顶点位置序号为initVex,终止顶点位置序号为termVex的边(结点)
       public ArcNode getArc (int initVex, int termVex) throws Exception {
              if(initVex < 0 || initVex >= vexNum)
                    throw new Exception("第" + initVex + "个顶点不存在!");
              if(termVex < 0 || termVex >= vexNum)
                    throw new Exception("第" + termVex + "个顶点不存在!");
              ArcNode arc = vexs[initVex].getFirstArc(); //arc指向起始顶点的第一条边
              while(arc != null && arc.getAdjVex() != termVex) {
                     arc = arc.getNextArc();        //arc指向起始顶点的下一条边
              }            
              return arc;
       }

       //广度优先遍历
       public void BFSTraverse() throws Exception {
             boolean[] visited = new boolean[vexNum];      //初始化辅助数组visited
              for(int i = 0; i < vexNum; i++) {
                     visited[i] = false;
              }

              LinkQueue<Integer> lq = new LinkQueue();    //创建辅助队列,数据元素为顶点的位置序号             
              
              for(int v = 0; v < vexNum; v++) {                     //依次访问图中的所有连通分量(或强连通分量)
                    if(!visited[v]) {
                            lq.offer(v);                                         //指定顶点v入队
                            while(!lq.isEmpty()) {
                                   int u = lq.poll();                          //辅助队列队首顶点出队
                                   System.out.print(vexs[u].getData() + " ");   //访问该顶点
                                   visited[u] = true;                        //标记该顶点为true
                                   //将刚出队的顶点的所有未被访问的邻接点加入辅助队列中
                                   for (int w = firstAdjVex(u); w>=0; w = nextAdjVex(u,w))  
                                          if(!visited[w]) 
                                                 lq.offer(w);     
                            }
                     }
              }
       }       




	boolean isConnected() throws Exception {

              if (kind!=GraphKind.UDG || kind!=GraphKind.UDN )

                     throw new Exception("该图不是无向图或无向网!");

              //用遍历判断,如果从一个点开始循环访问不到所有结点的就是非连通图 
              //广度优先遍历求解

              boolean[] visited = new boolean[vexNum];      //初始化辅助数组visited
              for(int i = 0; i < vexNum; i++) {
                     visited[i] = false;
              }

              LinkQueue<Integer> lq = new LinkQueue();    //创建辅助队列,数据元素为顶点的位置序号
              
              //访问本连通分量
              if (!visited[0]) {
                     lq.offer(0);                                         //第一个顶点入队
                     while (!lq.isEmpty()) {
                            int u = lq.poll();                          //辅助队列队首顶点出队
                            visited[u] = true;                        //标记该顶点为true

                            //将刚出队的顶点的所有未被访问的邻接点加入辅助队列中
                            for(int w = firstAdjVex(u); w>=0; w = nextAdjVex(u,w))  
                                   if(!visited[w]) 
                                          lq.offer(w);     
                     }
              }
              
              //判断:如果所有结点访问到了就是连通的
              for(int j = 0; j < vexNum ; j++) {
                     if(visited[j]==false)
                            return false;
              }
                     return true; 
       }
  }

测试:

测试图/网:
在这里插入图片描述
测试代码:

import dataStructure.Graph.ALGraph;
import dataStructure.Graph.VNode;
import dataStructure.Graph.ArcNode;
import dataStructure.Graph.GraphKind;
/*
 *本程序用来测试ALGraph类中的isConneted()方法
 *Graph1,Net2的示意图见上图.jpg”。
 */
 
public class GraphTest {  
public static void main(String[] args){
         //一个非连通无向图Graph1
            GraphKind kind1 = GraphKind.UDG;
            int vexNum1 = 4;
            int arcNum1 = 2;
            ArcNode a1 = new ArcNode(2);
            ArcNode b1 = new ArcNode(2);
            ArcNode d1 = new ArcNode(1);
            ArcNode c1 = new ArcNode(0,d1);
            VNode<Integer> gnode0 = new VNode(0, a1); 
            VNode<Integer> gnode1 = new VNode(1, b1); 
            VNode<Integer> gnode2 = new VNode(2, c1); 
            VNode<Integer> gnode3 = new VNode(3); 
            VNode<Integer> vexs1[] = new VNode[4];
            vexs1[0] = gnode0;
            vexs1[1] = gnode1;
            vexs1[2] = gnode2;
            vexs1[3] = gnode3;
            ALGraph<Integer> graph1 = new ALGraph(kind1,vexNum1, arcNum1, vexs1);
            try{
                   System.out.println("graph1连通吗?"+graph1.isConnected());
            }
            catch(Exception e){       }
          
            //一个连通无向网Net2
            GraphKind kind2 = GraphKind.UDN;
            int vexNum2 = 4;
            int arcNum2 = 3;
            ArcNode a2 = new ArcNode(2,1);
            ArcNode c2 = new ArcNode(1,2);
            ArcNode b2 = new ArcNode(0,1,c2);
            ArcNode e2 = new ArcNode(3,3);
            ArcNode d2 = new ArcNode(2,2,e2);
            ArcNode f2 = new ArcNode(1,3);
            VNode<Integer> nnode0 = new VNode(0, a2); 
            VNode<Integer> nnode1 = new VNode(1, d2);
            VNode<Integer> nnode2 = new VNode(2, b2); 
            VNode<Integer> nnode3 = new VNode(3, f2); 
            VNode<Integer> vexs2[] = new VNode[4];
            vexs2[0] = nnode0;
            vexs2[1] = nnode1;
            vexs2[2] = nnode2;
            vexs2[3] = nnode3;
            ALGraph<Integer> net2 = new ALGraph(kind2, vexNum2, arcNum2, vexs2);
            try{
                   System.out.println("net2连通吗?"+net2.isConnected());
            }
            catch(Exception e){       }
     }             
}   

运行结果:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

运用遍历判断无向图(网)是否连通 的相关文章

随机推荐

  • Excel截取字符串:从指定第N个分隔符处截取

    目的 如下图 截取下面字符串中最后一个 后面的部分字符串 思路 1 利用SUBSTITUTE A2 将分隔符替换成空字符 如下图 2 利用LEN A2 LEN SUBSTITUTE A2 即可获取里面被替换掉了多少个分隔符 3 由于SUBS
  • 京东云无线宝可以服务器吗,京东云无线宝哪种上网方式收益最高,这点你一定得知道...

    京东云无线宝路由作为一款可以赚积分的路由器 备受关注 怎么能获取更高的积分 是大家一直都非常关心的 今天我们就来聊一聊 京东云无线宝路由采用哪种上网方式 收益最高 在京东云无线宝的后台 我们可以看到路由器一共提供了4种上网方式 分别为 拨号
  • Redfish介绍和Postman工具使用

    Redfish Redfish的诞生是为了替代IPMI 由于IPMI自身的局限性和安全性缺陷 IPMI 在2015年公布2 0 v1 1标准后 不再更新 被RedFish永久代替 Redfish 可扩展平台管理 API The Redfis
  • DQN Pytorch示例

    智能体是一个字母o 它卡在许多 之间 而要达到的目的是并确保o两侧都有 这需要让o能够向左右两边移动 而且速度略快于无动作时的自然移动速度 看起来就像下面那样 这是一种很简单的情形 pytorch版本 1 11 0 cu113 代码 因为每
  • gDDIM: Generalized denoising diffusion implicit models

    gDDIM Generalized denoising diffusion implicit models 论文链接 2206 05564 gDDIM Generalized denoising diffusion implicit mod
  • 【实践3】Python pandas读取Excel指定单元格 / 在指定单元格插入数据,不改变Excel格式

    简单介绍 有时会遇到只需将爬取的数据填入指定的单元格 而不需要更改Excel格式的情况 或是将一个Excel指定单元格内容复制后插入另一个Excel的单元格 完整代码 import pandas as pd from openpyxl im
  • Cmake常用命令(二)

    本文主要介绍File关键字 它是文件系统相关的操作的入口 读文件 命令 格式 解释 示例 READ file READ
  • 初探支付对账

    大家好 我是老三 好久不见 最近比较忙碌 状态也不是太好 很久没有输出 最近在做对账系统的调研和设计 给大家分享一些对账系统的知识 什么是对账 有个男人叫小帅 娶了个老婆 叫小美 早上 小美给小帅二十块钱买早餐 小帅买了包子 油条 豆浆回来
  • Golang jwt跨域鉴权

    Golang jwt跨域鉴权 JWT全称JSON Web Token是一种跨域认证解决方案 属于一个开放的标准 它规定了一种Token实现方式 目前多用于前后端分离项目和OAuth2 0 安装jwt go get github com dg
  • java中集合框架汇总

    Java 集合框架主要包括两种类型的容器 一种是集合 Collection 存储一个元素集合 另一种是图 Map 存储键 值对映射 Collection 接口又有 3 种子类型 List Set 和 Queue 再下面是一些抽象类 最后是具
  • 【Shell编程】字符截取命令cut、printf命令

    目录 cut命令 功能 语法 参数 实例 测试文本 提取所有行的姓名 提取所有行的姓名和评分 分割文本 提取 etc passwd中用户的用户名 cut命令的局限 printf命令 功能 语法 参数 输出类型 输出格式 实例 以字符串格式输
  • message.h

    文章目录 message h 概述 objc super objc msgSend objc msgSendSuper objc msgSend stret objc msgSendSuper stret objc msgSend fpre
  • java--基础--14--File

    java 基础 14 File 1 介绍 用于操作文件和目录 文件夹 1 1 构造方法 File String pathname 根据一个路径得到File对象 File String parent String child 根据一个目录pa
  • 【Lua】不进位保留小数点X位数

    游戏需求常常因为数值太大 需要简化显示 例XX XX亿 XX XX万 lua在对两个整数进行除法操作时不会向C 那样将结果转换成整数 而是自动转换成浮点数 所以当我们保留小数使用string format 2f str 的时候 会自动完成四
  • 去掉小数点后面的0(javascript)

  • HTML导航菜单

    frameset html 文件
  • Docker运行gin项目(go mod)

    准备 先在本地把golang的docker镜像拉取下来 docker pull golang Dockerfile文件内容 在gin项目根目录下创建Dockerfile配置文件 指定基础镜像 FROM golang 维护人信息 MAINTA
  • 【TCN回归预测】基于TCN时间卷积神经网络实现数据多输入回归预测附matlab代码

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab仿真内容点击 智能优化算法 神经网络预测 雷达通信 无线传感器 信号处理 图像
  • strapi的使用(三)-- 上传图片

    1 建表添加媒体字段 2 前端请求格式 用axios举例 需要注意几点 第一 传文件时 参数前要加前缀files 比如我表里面的媒体文件字段名为img 前端需要传的参数就为files img 第二 传除文件外的其他参数时 需要其他参数包裹在
  • 运用遍历判断无向图(网)是否连通

    基本思路 使用广度优先遍历方法 任选一个结点开始遍历 遍历结束后每个结点都访问到了即为连通 主代码 判断是否连通的isConnected 方法在最末尾 import dataStructure linearList LinkQueue pu