图论基础

图概述

图(Graph)是一种比线性结构和树形结构都要复杂的数据结构。

简单讲,图是由表示数据元素的的集合V和表示数据之间关系的集合E组成。当中,数据元素常称作顶点(vertex)。数据之间的关系常称作边(edge)。

故图可记为G=<V,E>,当中V是顶点的有穷非空集合,E是边的集合。在图中顶点的前驱和后继是不设限制的,因此图描写叙述的是一种网状关系。

无向图

若边是无序的或者说是无向的。则称此图是无向图。

若无向图中有边(vi,vj)(无向图中边用圆括号表示),则显然(vj,vi)和(vi,vj)是同一条边。

有向图

若边是有序的或者说是有向的。则称此图是有向图。

若有向图中有边<vi,vj>(有向图中边用尖括号表示)。则显然<vj,vi>和<vi,vj>不是同一条边。有向图中的边也称为弧(arc)。对于弧<vi,vj>,vi是弧尾(边的起点),vj是弧头(边的终点)。

演示样例图

无向图 G1=<V1,E1> V1={v0,v1,v2,v3,v4}
E1={(v0,v1),(v0,v2),(v1,v3),(v2,v3),(v2,v4),(v3,v4)}

有向图 G2=<V2,E2> V2={v0,v1,v2,v3}
E2={<v0,v1>,<v0,v2>,<v2,v0>,<v2,v3>,<v3,v0>}

图的存储

所谓的图的存储,主要是想从存储结构中表达各顶点之间的联系,也就是表现图中的边。

由于顶点总是非常好存储的,如最常见的一维数组存储边:

顶点

v0 v1 v2 v3 v4

或者是

A B C D E

邻接矩阵(adjacency matrix)邻接表(adjacency list)是图的两种常见存储方式。

如上,无向图G1,对于顶点Vi和顶点Vj。若有边,则(Vi,Vj)=1,否则(Vi,Vj)=0。显然(Vi,Vi)=0,此时的邻接矩阵例如以下:

V0 V1 V2 V3 V4
V0 0 1 1 0 0
V1 1 0 0 1 0
V2 1 0 0 1 1
V3 0 1 1 0 1
V4 0 0 1 1 0

显然,因为是无向图。该矩阵是对称的。

邻接矩阵所需的存储空间的大小与边数无关。而与顶点数有关。它所需的空间复杂度是O(n^2)。n是顶点数。

相同的。若是使用邻接表来存储无向图G1。邻接表例如以下:

邻接表实质就是链式存储。

对于有权图,在邻接矩阵中仅仅需把1改为为对应的权值就可以,在邻接表中顶点结构体则需加入成员表示权值。

经常使用概念

  1. 顶点的度(degree):与顶点关联的边的数目,记为D(v)。特别的,在有向图中,把顶点v作为终点的弧的数目是入度(in degree),记为ID(v)。把顶点v作为起点的弧的数目是出度(out degree),记为OD(v)。

    显然,D(v)=ID(v)+OD(v)。

  2. 顶点v1和顶点v2若是有边相连的,则称它们是相邻的(adjacent)。
  3. 用n表示顶点数,e表示边数。则无向图中e是[0,n(n-2)/2](update:正确的是[0,n(n-1)/2])。有向图中e是[0,n(n-1)]。
  4. 边数较少的图称为稀疏图(sparse graph),边数较多则称为稠密图(dense graph)。
  5. 全然图:随意两个顶点之间都有边相关联的是全然图。全然图中边数达到最大。细分为无向全然图和有向全然图。
  6. 有时边是带有权值的,这个权值能够表示从一个顶点到还有一个顶点的距离、代价、耗费等。这种图也称为带权图。

  7. 子图:设G=<V,E>是一个图,V1是V的子集,E1是E的子集,且E1中的边仅仅与V1中的顶点有关,则称G1=<V1,E1>是G的的子图(subgraph)。
  8. 路径:在无向图中顶点序列:vi,vj,…,vk,且相邻两顶点之间是有边的,则这个序列构成一条路径。在有向图中,构成路径的不仅是要有边,并且边的方向正确:仅仅能是起点到终点。
  9. 简单路径:路径中不存在反复顶点。则是简单路径(simple path)。
  10. 环:在一条路径中,仅仅有第一个顶点和最后一个顶点同样,这条路径就是环(cycle)或回路。
  11. 路径长度:路径上边的数目。
  12. 无环图:没有环的图(acyclic graph)。在有向图中,那就是有向无环图。
  13. 在无向图中,若顶点vi和vj是有路径的,则称vi和vj是连通的(connected)。

    若图中随意两个顶点都是连通的,则称该图是连通图。

  14. 连通分量:无向图中的极大连通子图。(所谓的极大是指再增加随意一个顶点,则不连通)
  15. 在有向图中。随意两个顶点之间都有一条有向的路径,则称该有向图是强连通图。
  16. 强连通分量:有向强连通的极大子图称为有向图的强连通分量或强连通分支。

转载请注明出处。本文地址:http://blog.csdn.net/zhangxiangdavaid/article/details/37915329

若有所帮助,顶一个哦!

专栏文件夹:

时间: 2024-07-30 10:18:15

图论基础的相关文章

数据结构:图论基础

图概述 图(Graph)是一种比线性结构和树形结构都要复杂的数据结构.简单讲,图是由表示数据元素的的集合V和表示数据之间关系的集合E组成.其中,数据元素常称作顶点(vertex),数据之间的关系常称作边(edge).故图可记为G=<V,E>,其中V是顶点的有穷非空集合,E是边的集合.在图中顶点的前驱和后继是不设限制的,因此图描述的是一种网状关系. 无向图 若边是无序的或者说是无向的,则称此图是无向图.若无向图中有边(v1,v2)(无向图中边用圆括号表示),则显然(v2,v1)和(v1,v2)是

图论基础知识总结

图论基础知识总结 前言 因为博主太菜,好多之前学过的图论算法都要不记得了,于是开了这篇博文提醒自己要记得复习图论. 代码 #include<bits/stdc++.h> using namespace std; #define gc() getchar() inline int In(){ char c=gc(); int x=0,ft=1; for(;c<'0'||c>'9';c=gc()) if(c=='-') ft=-1; for(;c>='0'&&c&

图论基础知识.

今天先写一些基础的图论知识: 1.floyed算法: 2.spfa算法: 3.dijkstra(迪杰斯特拉)算法:(先不写) 1.floyed算法 可以找到任意两点之间的最短路,即dis[i][j]: 原理:图的传递闭包思想:时间复杂度:O(n*n*n); 思想也比较好理解(三角形任意两边之和大于第三边嘛,如果出现不符合,就更新距离,这样比较好想) 例题oj1212图G是一个无向连通图,没有自环,并且两点之间至多只有一条边.我们定义顶点v,u最短路径就是从v到u经过边最少的路径.所有包含在v-u

图论基础——邻接链表存图+拓扑排序

邻接链表存图,在这里其实是用数组进行模拟的 又叫做链式存储法,本来是要用链表实现的,但大多数情况下只需要用数组模拟即可 例: u(边的起点) v(边的终点) w(边的权值) 4 2 1 1 2 3 1 4 1 1 5 2 4 3 4 2 3 1 话不多说,直接上代码 for(int i=1;i<=m;i++) { scanf("%d%d%d",&u1,&v1,&w1); e[i].u =u1;//赋给第i条边的起点 e[i].v =v1;//赋给第i条边的

图论基础知识(1)-什么是图和图的分类

emmm......蒟蒻的第一篇博客,先讲一个比较简单的东西来熟悉以下操作吧(还是怕自己翻车) 由于本人知识水平有限,暂时不会涉及相关数学知识,这篇博客主要还是提供个人对图论的比较感性的认识 这篇文章将要介绍: 图的基本定义 图的简单分类 一些简单术语的解释 因为本人比较蒻,所以这篇博客会讲的非常慢,dalao们可以绕步了... Part1 什么是图: 这是百度百科里面给出的解释,很重要的一条就是:“这种图形通常是用来描述某些事物之间的某种特定关系”,也就是说图实际上存储的是一些关系,所以说以下

图论基础及相关练习

图论起源于著名的哥尼斯堡七桥问题.大家应该都了解过这个故事.

动态规划综合+图论基础

今天zkj大佬来讲课,一晚上有一个这么强的PPT太学了! 那么我们步入正题,首先看到图论: 图论 例题1:lg1144 很简单,我们直接bfs(因为边权都是1,也就是无权图)求路径数就可以了. #include<bits/stdc++.h> using namespace std; const int maxm=2000010,maxn=1000010,Inf=2147483647; const int Mod=100003; struct node{ int to,next; }e[maxm

图论基础——最短路算法集锦

最短路算法有个基础——————松弛操作(在大多数最短路算法都会涉及) if(d[e[i].v]>d[e[i].u]+w[i])//如果这条边的终点到源点的距离大于起点到源点距离,就替换. { d[e[i].v]>d[e[i].u]+w[i]; } 最短路算法一共有多少种方法我不知道,在这里我只想记录4种: •Dijkstra:求单源点最短路(不含负边权) •Bellman-ford:求单源点最短路(可含负边权) •SPFA(使用队列优化后的Bellman-ford) •Floyd:求各点间的最

并查集 - 图论基础

2017-07-25 22:18:16 writer:pprp 定义:(来源于搜狗百科)并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.常常在使用中以森林来表示. 作用:用来判断两个节点是否属于同一颗树: 操作:1,查找,Find    2,合并,Merge #include <iostream> using namespace std; int parent[1000]; int Find(int x) { if(parent[x] == x

图论基础学习

//zjnu 1410//floyed #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; #define inf 0x3fffffff int mp[201][201],n; void floyed() { int i,j,k,mi=inf; for(i=0;i<n;i++) { for(j=0;j<n;j+