无向图是一种最简单的图模型,在这种图模型中,边仅仅是两个顶点之间的连接。我们用v-w的记法表示连接v和w的边,而w-v是这条边的另一种表示方法。

特殊的图。自环:即一条连接一个顶点和其自身的边;

连接同一对顶点的两条边称为平行边。

简单术语介绍

当两个顶点通过一条边相连时,我们称这两个顶点是相邻的,并称这条边依附于这两个顶点。某个顶点的度数即为依附于它的边的总数。子图是由一幅图的所有边的一个子集(以及它们所依附的所有顶点)组成的图。

路径是由边顺序连接的一系列顶点。简单路径是一条没有重复顶点的路径。环是一条至少含有一条边且起点和终点相同的路径。简单环是一条(除了起点和终点必须相同之外)不含有重复顶点和边的环。路径或者环的长度为其中所包含的边数。

如果从任意一个顶点都存在一条路径到达另一个任意顶点,我们称这幅图是连通图。一幅非连通的图由若干连通的部分组成,它们都是其极大连通子图。树是一幅无环连通图。互不相连的树组成的集合称为森林。连通图的生成树是它的一幅子图,它含有图中的所有顶点且是一棵树。图的生成树森林是它的所有连通子图的生成树的集合。一棵树生成树森林

树的数学性质

当且仅当一幅含有V个结点的图G满足下列五个条件之一时,它就是一棵树:G有V-1条边且不含有环

G有V-1条边且是连通的

G是连通的,但删除任意一条边都会使它不再连通

G是无环图,但添加任意一条边都会产生一条环

G中的任意一对顶点之间仅存在一条简单路径。

图的密度是指已经连接的顶点对占所有被连接的顶点对的比例。在稀疏图中,被连接的顶点对很少;而在稠密图中,只有少部分顶点对之间没有边连接。一般来说,如果一幅图中不同的边的数量在顶点总数V的一个小常数倍以内,那么我们就认为这幅图是稀疏的。

二分图是一种能够将所有结点分为两部分的图,其中图的每条边所连接的两个顶点都分别属于不同的部分。

表示无向图的数据类型

要开发处理图问题的各种算法,我们首先来看一份定义了图的基本操作的API无向图的API

最常用的图处理代码

计算v的度数

public static int degree(Graph G, int v){

int degree = 0;

for (int w : G.adj(v))degree++;

return degree;

}

计算所有顶点的最大度数

public static int maxDegree(Graph G){

int max = 0;

for (int v = 0; v < G.V(); v++)

if (degree(G,v) > max)

max = degree(G,v);

return max;

}

计算所有顶点的平均度数

public static double avgGegree(Graph G){

return 2.0 * G.E() / G.V();

}

计算自环的个数

public static int numberOfSelfLoops(Graph G){

int count = 0;

for (int v = 0; v < G.V(); v++)

for(int w : G.adj(v))

if( v == w)count++;

return count/2;//每条边被记录过两次

}

图的邻接表的字符串表示(Graph的实例方法)

public String toString(){

String s = V + "vertices," + E + " edges\n";

for (int v = 0; v < V; v++){

s += v + ": ";

for(int w : this.adj(v))

s += w + " ";

s += "\n";

}

return s;

}

图的几种表示方法

在这里我们需要面对的问题是用哪种方式(数据结构)来表示图并实现API,这包含以下两个要求。它必须为可能在应用中碰到的各种类型的图预留出足够的空间;

Graph的实例方法的实现一定要快——它们是开发处理图的各种用例的基础。

这些要求 比较模糊,但它们仍然能够帮助我们在三种图的表示方法中进行选择。邻接矩阵。我们可以用一个V乘V的布尔矩阵。当顶点v和顶点w之间有相连接的边时,定义v行w列的元素为true。这种表示方法不符合第一个条件——含有上百万个顶点的图是很常见的,V^2个布尔值所需要的空间是不能满足的。

边的数组。我们可以使用一个Edge类,它含有两个int实例变量。这种表示方法很简洁但不满足第二个条件——要实现adj()需要检查图的所有边。

邻接表数组。我们可以使用一个以顶点为索引的列表数组,其中的每个元素都是和该顶点相邻的顶点列表,如图。这种数据结构能够同时满足上面两点。邻接表数组示意(无向图)

邻接表的数据结构

非稠密图的标准表示称为邻接表的数据结构,它将每个顶点的所有相邻顶点都保存在该顶点对应的元素所指向的一张链表中。我们使用这个数组就是为了快速访问给定顶点的邻接顶点列表。我们使用Bag这个抽象数据类型来实现这个链表,这样我们就可以在常数时间内添加新的边或遍历任意顶点的所有相邻顶点。

这种Graph的实现的性能有如下特点:使用的空间可V+E成正比

添加一条边所需要的时间为常数

遍历顶点v的所有相邻顶点所需要的时间和v的度数成正比(处理每个相邻顶点所需的时间为常数)

Graph数据类型

public class Graph {

private final int V;//顶点数目

private int E;//边的数目

private Bag[] adj;//邻接表

public Graph(int V) {

this.V = V;this.E = 0;

adj = (Bag[]) new Bag[V];//创建邻接表

for(int v = 0; v < V; v++)//将所有链表初始化为空

adj[v] = new Bag();

}

public Graph(In in) {

this(in.readInt());//读取V并将图初始化

int E = in.readInt();//读取E

for(int i = 0; i < E; i++ ) {

//添加一条边

int v = in.readInt();//读取一个顶点

int w = in.readInt();//读取另一个顶点

addEdge(v,w);//添加一条连接他们的边

}

}

public int V(){return V;}

public int E(){return E;}

public void addEdge(int v, int w) {

adj[v].add(w);

adj[w].add(v);

E++;

}

public Iterable adj(int v){

return adj[v];

}

}

这份Graph的实现使用了一个由顶点索引的整数链表数组。每条边都会出现两次,即当存在一条连接v与w的边时,w会出现在v的链表中,v也会出现在w的链表中。第二个构造函数从输入流中读取一幅图,开头是V,然后是E,再然后是一列整数对,大小在0到V-1之间

实际操作情况

在实际应用中还有一些操作可能是很有用的,例如添加一个顶点

删除一个顶点

实现这些操作的一种方法是扩展之前的API,使用符号表(ST)来代替由顶点索引构成的数组(这样修改之后就不需要约定定点名必须是整数了)。删除一条边

检查图是否含有边v-w

要实现这些方法可能需要使用SET来替代Bag来实现邻接表。我们称这种方法为邻接集。典型Graph实现的性能复杂度

无向简单图怎么判断_无向图基础相关推荐

  1. 无向简单图怎么判断_无向图的基本算法

    根据性质,图可以分为无向图和有向图.本文先介绍无向图,后文再介绍有向图.之所以要研究图,是因为图在生活中应用比较广泛. 无向图 图是若干个顶点(Vertices)和边(Edges)相互连接组成的.边仅 ...

  2. 无向简单图怎么判断_如何判断车身正不正?其实很简单,3张图就看懂

    以下文章来源于:让你3小时快速过科一科四,不过包赔的车轮驾考通 无论是在科二还是科三,都有部分环节要求学员将车身调正.让部分学员费解的是,往往训练中教练一眼就看出自己车身歪了,而自己却毫无察觉,教练是 ...

  3. java 引用 判断_[JAVA基础]你知道Java的四种引用类型吗

    https://www.cnblogs.com/huajiezh/p/5835618.html https://www.cnblogs.com/yueshutong/p/9531347.html 在J ...

  4. 无向简单图怎么判断_bfs----判断无向简单图中任意两点是否连通

    #include struct { int city,pre; } sq[100]; int jz[50][50]; int qh,qe,n,visited[100]; void out(int qe ...

  5. python 动态执行条件判断_【人生苦短,我学 Python】基础篇——条件判断与循环语句(Day12)_不积跬步,无以至千里!-CSDN博客...

    原文作者:AI 菌 原文标题:[人生苦短,我学 Python]基础篇--条件判断与循环语句(Day12) 发布时间:2021-02-08 23:17:06 写在前面:大家好!我是[AI 菌],一枚爱弹 ...

  6. 计算机应用基础7074,毕业论文_计算机应用基础

    <毕业论文_计算机应用基础>由会员分享,可在线阅读,更多相关<毕业论文_计算机应用基础(30页珍藏版)>请在人人文库网上搜索. 1.简单几何图形的识别和编辑摘要本论文主要讲述了 ...

  7. HDU1878(判断一个无向图是否存在欧拉回路)

    1.欧拉回路:定义:经过图(有向图或无向图)中每条边一次且仅一次并且行遍图中每个顶点的回路( 闭合的欧拉路径,即一个环,保证每条边都通过且仅通过一次). 2.问题1:判断一个无向图是否有欧拉回路的充要 ...

  8. 计算机术语中CPU是指______,试题题库_计算机基础知识考试试卷全套.doc

    试题题库_计算机基础知识考试试卷全套.doc 第一部分 计算机基础知识 (一)单项选择题 1. 世界上第一台计算机使用的物理器件是( ). A)电子管 B)继电器 C)晶体管 D)集成电路 2. 第四 ...

  9. python解释器环境中用于表示上一次运算结果的特殊变量_知到智慧树_中国画基础_作业题库答案...

    知到智慧树_中国画基础_作业题库答案 更多相关问题 消费者在举行婚礼时穿正式礼服,而在酒吧穿休闲套装,这是因为()情境不同. (内毒素)的主要成分是 ()一般由革兰氏阴性菌产生,是细胞壁中的成份.只有 ...

最新文章

  1. java 创建对象的init_Java的对象实例是什么时候被创建
  2. NYOJ 752 又见回文串
  3. 侧边栏跳转_微信和三星首次系统级合作:在负一屏和侧边栏直接打开小程序
  4. Lumen中启用session
  5. linux缓存文件用户权限错误,CVE-2019-11244漏洞到底该如何修复?--关于缓存文件权限设置...
  6. python基础-第三篇-函数编程
  7. VMWARE VICLIENT实现虚拟机独立管理
  8. python 微信跳一跳辅助 复现
  9. Java知识总结,不止为了秋招(下)!!!
  10. php 注销session_php中如何删除和销毁Session
  11. 金蝶K3--生产领料单--更新销售订单编号
  12. 计算机 黑屏 显示桌面,电脑开机后显示桌面黑屏了怎么处理啊?
  13. Heartbeat 与Corosync对比分析
  14. linux_常用命令
  15. 用python画哆啦a梦的身体_每天一个Python小技巧,用Python 画个多啦A梦,小猪佩奇,文末还有Python入门学习视频...
  16. linux蓝牙语音遥控器,Linux系统下遥控器的配置与使用方法
  17. c语言矢量字体库,单片机用矢量字库的C语言调用
  18. pureftp部署优化
  19. 【PTA|Python】浙大版《Python 程序设计》题目集:第六章
  20. Pandas中multiindex转换成列

热门文章

  1. Word中字号和磅值的对应关系
  2. WPF 文件、文件夹操作
  3. 计算机学院的迎新晚会,计算机学院举办“互联青春,拾梦翱翔”迎新晚会
  4. 2023成都电源工业展览会
  5. 寒假线上兼职:300-500元/小时,安利一个大学生也能月入8K的线上兼职!
  6. VMware与宿主机文件夹共享、虚拟机磁盘映射
  7. 本地如何内网穿透映射外网
  8. 360浏览器: 如何以极速模式打开网址
  9. Android SMB 简单几步实现手机给电脑传输数据
  10. 区块链技术中隐私计算的技术特点