图论基础(自认为很全)

什么是图在一个社交网络中,每个帐号和他们之间的关系构成了一张巨大的网络,就像下面这张图:那么在电脑中,我们要用什么样的数据结构来保存这个网络呢?这个网络需要用一个之前课程里未提到过的数据结构,也就是接下来要讲解的图结构来保存。到底什么是图?图是由一系列顶点和若干连结顶点集合内两个顶点的边组成的数据结构。数学意义上的图,指的是由一系列点与边构成的集合,这里我们只考虑有限集。通常我们用 G=(V,E) 表示一个图结构,其中V表示点集,E表示边集。在顶点集合所包含的若干个顶点之间,可能存在着某种两两关系
摘要由CSDN通过智能技术生成

什么是图

在一个社交网络中,每个帐号和他们之间的关系构成了一张巨大的网络,就像下面这张图:
在这里插入图片描述
那么在电脑中,我们要用什么样的数据结构来保存这个网络呢?这个网络需要用一个之前课程里未提到过的数据结构,也就是接下来要讲解的结构来保存。

到底什么是图?图是由一系列顶点和若干连结顶点集合内两个顶点的边组成的数据结构。数学意义上的图,指的是由一系列点与边构成的集合,这里我们只考虑有限集。通常我们用 G=(V,E) 表示一个图结构,其中V表示点集,E表示边集。

在顶点集合所包含的若干个顶点之间,可能存在着某种两两关系——如果某两个点之间的确存在这样的关系的话,我们就在这两个点之间连边,这样就得到了边集的一个成员,也就是一条边。对应到社交网络中,顶点就是网络中的用户,边就是用户之间的好友关系。

如果用边来表示好友关系的话,对于微信这种双向关注的社交网络没有问题,但是对于微博这种单向关注的要如何表示呢?

于是引出了两个新的概念:有向边和无向边。

简而言之,一条有向边必然是从一个点指向另一个点,而相反方向的边在有向图中则不一定存在;而有的时候我们并不在意构成一条边的两个顶点具体谁先谁后,这样得到的一条边就是无向边。就像在微信中,AB的好友,那B也一定是A的好友,而在微博中,A关注B并不意味着B也一定关注A

对于图而言,如果图中所有边都是无向边,则称为无向图,反之称为有向图。

简而言之,无向图中的边是“好友”,而有向图中的边是“关注”。一般而言,我们在数据结构中所讨论的图都是有向图,因为有向图相比无向图更具有代表性。

实际上,无向图可以由有向图来表示。如果AB两个点之间存在无向边的话,那用有向图也可以表示为AB两点之间同时存在ABBA两条有向边。

仍然以社交网络举例:虽然微博中并不存在明确定义的好友关系,但是一般情况下,如果你和另一个 ID 互相关注的话,那么我们也可以近似认为,你和 TA 是好友。

我们来形式化地定义一下图:图是由顶点集合(简称点集)和顶点间的边(简称边集)组成的数据结构,通常用G(V,E)来表示。其中点集用V(G) 来表示,边集用 E(G) 来表示。在无向图中,边连接的两个顶点是无序的,这些边被称为无向边。例如下面这个无向图G,其点集V(G)={1,2,3,5,6},边集为E(G)={(1,2),(2,3),(1,5),(2,6),(5,6)}
在这里插入图片描述

而在有向图中,边连接的两个顶点之间是有序的。箭头的方向就表示有向边的方向。

例如下面这张有向图G’
在这里插入图片描述
其点集V(G′)={1,2,3,5,6},边集为E(G′)={(1,2),(2,3),(2,6),(6,5),(1,5)}。对于每条边 (u,v) ,我们称其为从u到v的一条有向边,u是这条有向边的起点v 是这条有向边的终点。注意在有向图中,(u,v)(v,u) 是不同的两条有向边。

图的分类

在这里插入图片描述
在这里插入图片描述
对于一个图,如果以任意一个点为起点,在图上沿着边走都可以到达其他所有点(有向图必须沿有向边的方向),那么这个图就是连通图。显然完全图一定是连通图。

定义

在无向图中,顶点的是指某个顶点连出的边数。例如在下图中,顶点 b 的度数为3,顶点 a 的度数为4。
在这里插入图片描述
在有向图中,和度对应的是入度出度这两个概念。顶点的入度是指以该顶点为终点的有向边数量;顶点的出度是指以顶点为起点的有向边数量。需要注意的是,在有向图里,顶点是没有的概念的。例如在下图中,顶点 a 的入度为1,出度为3;顶点 c 的入度为2,出度为2。
在这里插入图片描述

度的性质

在无向图或有向图中,顶点的度数总和为边数的两倍,即:
在这里插入图片描述
而在有向图中,有一个很明显的性质就是,入度等于出度
|
|
|
|
|
无向图度数统计

#include <iostream>
using namespace std;
int deg[105];
int main() {
   
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < m; i++) {
   
        int u, v;
        cin >> u >> v;
        deg[u]++;
		deg[v]++;
    }
    for (int i = 1; i <= n; i++) {
   
        cout << deg[i] << " ";
    }
    return 0;
}

有向图度数统计

#include <iostream>
using namespace std;
int outdeg[105], indeg[105];
int main() {
   
    int n, m;
    cin >> n 
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值