某科学的简单图论

既然说是简单图论,那就谈谈简单的东西好了。

先举一个特别简单的例子,比如说一个关系图。

我是yxc的父亲,那么我和yxc就构成了父子关系。而我又同样是xlc和cx的父亲,那么我就是他们的共同的父亲。

这样的关系图绘制出来就是一幅图。

这是一个崭新的数据结构(虽然这是第一个数据结构,竟然就是图了嘛),叫做图。

从数学的角度来解释图,图就是点边的集合。在信息学里,我们只考虑有限的图。我们将一幅图表示为G=(V,E);

V是点的集合,E是边的集合。

那么有一个问题就出现了,什么情况下要加入一条边呢?答案非常的明显,就是当两者有关系的时候加边呗。

那么接下来引出有向图和无向图的概念。

那b站up来举例子吧。

老番茄只关注了辣个变态(bushi),很多的up关注了老番茄。此时把关注当做一条边的话,那么就是由很多up连向老番茄的一条边,老番茄连向变态的那条边。这样的一幅图,就叫做“有向图”,即边是有方向的。

而我们知道,老番茄关注了变态,变态也关注了番茄。这俩是相互的关注,我们把一样相互的边称为无向边。从此我们可以知道,两条双向的有向边和一条无向边是等效的。由无向边组成的图,我们就称为“无向图”。

接下来给各位两幅图,一个是有向图,一个是无向图。

无向图:V(1,2,3,5,6) E{(1,2),(2,3),(1,5),(2,6),(5,6)}

无向图中的边的集合中,两点之间就有一条线,即(x,y)就是在x和y之间连了一条线。注意:此时(x,y)等效于(y,x)

有向图:V(1,2,3,5,6) E{(1,2),(2,3),(1,5),(2,6),(5,6)}

有向图的边的集合中,两点之间的线是存在方向的,即(x,y)是从x出发指向y的一条线,x是起点,y是终点。注意:此时(x,y)不等效于(y,x)

对于以上图的分类需要注意好,在存图的时候会用到。

图本身的概念讲完了,讲讲图相关的概念。

稠密图和稀疏图。这个概念很好理解的,把一幅图比作你的头,边就是你的头发,规定一个标准,如果e < nlogn,那就算是稀疏图,反之相反。

如果没有边,只存在点的话,就是零图。

完全图。完全图也分为有向完全图和无向完全图(一般无向完全图直接称作完全图)。

无向完全图:e = n*(n+1) / 2 时,就是一个无向完全图。

有向完全图:任何一个顶点u,v之间都有两条有向边(u,v),(v,u),那么就称作有向完全图。

(可以自己画一个或者百度一个找找感觉)

如果从一个点出发,沿着边走可以到达每一个点,就可以称作连通图(有向边要走该有向边方向),显然完全图就是连通图

度。在图中,度的概念有所不同,度是指该边能够引出的边的数目,称作度。

在有向图里,有入度和出度两个概念,入度是指以这个点为终点的有向边数量,出度是以这个点为起点的有向边数量,入度就是以这个点作为终点的有向边数量。

注意:在有向图里,只有入度和出度这两个概念,没有纯“度”的概念。

接下来介绍一下度的性质:

1.顶点度数的总和就是边数的2倍

2.有向图里,入度=出度

接下来是关于度数的统计,可以先想一想怎么实现。

首先是无向图,只用在输入这幅图的时候直接记录就行了,开一个DEG数组。

#include <iostream>
using namespace std;
int deg[10005];
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;
}
View Code

接下来是有向图,如果你看懂了无向图的度数存储方式,其实有向图只是照葫芦画瓢,注意出度入度的安排即可。

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

到此,关于图的基本概念已经几乎结束了。

下一篇文应该就是图的存储方式了。(不过不知道什么时候写,毕竟是老鸽子了,大概在noip2020之前吧)

如果你通过这篇文章学习到了东西,或者从这篇文章明白了什么,不妨点个赞吧!你的支持就是我的最大动力。

posted @ 2020-08-18 22:48  Euclid_Euler  阅读(159)  评论(0)    收藏  举报