图论:图的概念与图的储存方式

转载自http://acm.uestc.edu.cn/bbs/read.php?tid=5670

下载ppt帐号:qscqesze

密码:123456

-------------------------------------------------------------------

1.图的基本概念

图:二元组(V, E) 。V 为顶点集。E为V 中结点之间的边的集合。

自环:一条边的两个端点是相同的。

多重边:两个端点之间有两条以上的边,称他们是多重边。

简单图:没有自环和多重边的图

无向边:边是双向的

有向边:单向边,有箭头

无向图:只有无向边的图

有向图:只有有向边的图

顶点的度:
无向图中,一个顶点相连的边数称为该顶点的度。
有向图中,从一个顶点出发的边数称为该顶点得出度;到达该顶点的边数称为它的入度。

权和网:

在图的边给出相关的数,成为权。权可以表示一个顶点到另一个顶点的距离,耗费等。带权图一般成为网。

完全图、稠密图和稀疏图:
任何两个顶点之间都有边(弧)相连称为完全图

边(弧)很少的图称为稀疏图反之为稠密图

2.图的存储

邻接矩阵:

int g[max_v+1][max_v+1];
void init()//初始化
{
    for(int i=1;i<=max_v;i++)
        for(int j=1;j<=max_v;j++)
        {
            if(i==j)
                g[i][j]=0;
            else
                g[i][j]=inf;
        }
}
void add_edge(int a,int b,int c)
{
    g[a][b]=g[b][a]=c;//双向边
    //g[a][b]=c;单向边情况
}

空间复杂度:O(V^2)

优点:直观,容易理解,可以直接查看任意两点的关系。
缺点:对于稀疏图,会有很多空间根本没有利用。对于带权图,不能处理重边。要查询某一个顶点的所有边,要枚举V次。

在邻接矩阵表示中,除了存放顶点本身信息外,还用一个矩阵表示各个顶点之间的关系。若(i,j)∈E(G)或〈i,j〉∈E(G),则矩阵中第i行 第j列元素值为1,否则为0 。

图的邻接矩阵定义为:
                       1           ,若(i,j)∈E(G)或〈i,j〉∈E(G)
  A[i][j]=
                       0            ,其它情形

例如, 下面为两个无向图和有向图对应的邻接矩阵:

类似地可以定义网的邻接矩阵为:
                   wij           若(i,j)∈E(G)或〈i,j〉∈E(G)
A[i][j]=        0              若i=j
                   ∞            其它情形

图的存储-邻接表

struct Edge
{
    int u,v;//边权
}
vector<Edge> e[max_v+1];
void init()//初始化
{
    for(int i=1;i<=max_v;i++)
        e[i].clear();
}
void add_edge(int a,int b,int c)
{
    e[a].push_back((Edge){b,c});
    e[b].push_back((Edge){a,c});//双向边情况
}

空间复杂度:有向图O(V+E)无向图O(V+2*E)
    
    优点:节省空间,能快速找到某个顶点所有相连的顶点,而无需访问无关顶点。

对图的每个顶点建立一个单链表(n个顶点建立n个单链表),第i个单链表中的结点包含顶点Vi的所有邻接顶点。

图的储存——前向星

nt first[MAXN];      //first[x]表示顶点x连出去的第一条边的存储位置
int next[MAXM];    //next[i]表示第i条边的下一条边的位置
int v[MAXM];        //v[i]表示第i条边的终点
int w[MAXM];       //w[i]表示第i条边的权值
int  cnt;         //表示当前一共加入多少条边

初始化:memset(first,0,sizeof(first));
             memset(next,0,sizeof(next));
加入一条权值为q的边   x->y :
cnt++;
next[cnt]=first[x];     first[x]=cnt;  v[cnt]=y;  w[cnt]=q;
使用:for (int i=first[x];i;i=next[i])   {……}
            //v[i]即为x发出的点,w[i]为相应边的权值

前向星与邻接表相似,不再过多赘述

时间: 2024-08-10 18:07:50

图论:图的概念与图的储存方式的相关文章

图论讲解(1)——图基础

前面一直在哔哔数论,是不是感觉很烦的慌了?? ╮(╯▽╰)╭唉,你不烦得慌我都烦得慌了! 既然这样,那我们就改个话题,今天我们就讲讲图论. 有的同学就要问图又是个什么鬼? 难道是这个吗?                                          还是这个??? 哎呀,身为c++选手,我们肯定说的不是这些东西了对吧! 我们信息学上所说的图是指一个有序的二元组(V,E),V是顶点的集合,E是边的集合,E中的每一个元素都用一个二元组(x,y)来表示,其中x,y∈v. 这么说是不

37. 蛤蟆的数据结构笔记之三十七图的概念

37. 蛤蟆的数据结构笔记之三十七图的概念 本篇名言:"宿命论是那些缺乏意志力的弱者的借口.--罗曼? 罗兰" 又到了一个新概念,这次咱们来看 这个图,图一看给人一种凌乱的感觉.那么它在数据结构中又是什么呢? 欢迎转载,转载请标明出处: 1.  图的概念 图(graph)是一种比线性表.树更为复杂的数据结构.在线性表中,数据元素之间呈线性关系,即每个元素只有一个直接前驱和一个直接后继.在树型结构中,数据元素之间有明显的的层次关系,即每个结点只有一个直接前驱,但可有多个直接后继,而在图结

数据结构-图的概念

根据我做过的一些错题.我想要简要总结一下一些比较容易忽略的图的概念. 1完全有向图和完全无向图. 一个有向图,有n个结点,则最多有n(n-1)条边.这种有n(n-1)条边的有向图是完全有向图. 一个无向图有n个节点,则最多有n(n-1)/2条边.这种n(n-1)/2条边的无向图是完全无向图. 2连通,连通图,连通分量. 在无向图中,vi到vj有路径,则说vi到vj连通. 若无向图的任意两个节点都连通,说这是连通图. 连通分量,在理解它之前,先要理解什么事极大连通子图. A B是连通子图  A C

图的概念、存储及遍历

图的概念.存储及遍历 图是一种特殊的数据结构,由点和边构成,它可以用来描述元素之间的网状关系,这个网状没有顺序,也没有层次,就是简单的把各个元素连接起来.图在我们的生活中也十分常见,地图就是最简单的例子. 图的基本概念: 顶点集合为V,边集合为E的图记作G=(V,E).另外,G=(V,E)的顶点数和边数分别为|V|和|E|.对于两个图G和G',如果G'的顶点集合与边集合均为G的顶点集合与边集合的子集,那么称G'是G的子图.子图实际上就是一张图里面小一点的图,也可以是点,不难理解. 有向图:图的边

图的3种储存方式

图的储存方式有三种 一.邻接矩阵 优点:简洁明了,调用方便,简单易写: 缺点:内存占用大,而且没办法存重边(可能可以,但我不会),点的个数超过 3000 直接爆炸 适用范围:点的个数少,稠密图,一般结合floyed使用,可以传递闭包. 代码: scanf("%d%d",&u,&v,&w); a[u][v]=w; a[v][u]=w;// 双向边 二.邻接表 优点:占用空间小,可以快速查找每个点的出度,重边可以存,写着较为方便 缺点:查找和删除边很不方便,对于无向

数据结构之图(一)图的存储结构

图的存储结构相对于线性表和树来说更为复杂,因为图中的顶点具有相对概念,没有固定的位置.那我们怎么存储图的数据结构呢?我们知道,图是由(V, E)来表示的,对于无向图来说,其中 V = (v0, v1, ... , vn),E = { (vi,vj) (0 <=  i, j <=  n且i 不等于j)},对于有向图,E = { < vi,vj > (0 <=  i, j <=  n且i 不等于j)}.V是顶点的集合,E是边的集合.所以我们只要把顶点和边的集合储存起来,那么

量化投资_关于Multicharts砖型图(传统砖型图和非传统砖型图)最详细的解释

1. Multicharts的图表中有砖型图的解释,参考官方论坛解释:https://forum.multicharts.cn/forum/cat/1/thread/2821?k=%E7%A0%96 2. 砖型图在交易中会非常棒的提升交易绩效,因为砖型图起到了降噪和二分的作用,降噪不用多解释,因为事先设定砖型图的波动单位,不符合这个单位的小波动就被过滤掉了:所谓二分就是在砖型图的世界中只有两种状态:涨和跌,因此对于绩效的提升非常棒. 3. 但是在Multicharts砖型图不能直接用于交易,这就

[图论笔记]基本概念

什么是图 定义 一个图是由一个顶点集.一个边集和一个关系构成的三元组,其中的关系使得每一条边与两个顶点(不一定是不同的顶点)相关联,并将这两个顶点称为这条边的端点. 一个圈是两个端点相同的一条边.重边是具有同一对端点的多条边. 简单图是不含圈和重边的图. 顶点集和边集是空集的图称为空图. 图模型 一个简单图的补图也是一个简单图,其顶点集为,且当且仅当. 团是图中两两相邻的顶点构成的集合.独立集(或稳定集)是图中由两两互不相邻的顶点构成的集合. ?

Android之自定义控件实现天气温度折线图和饼状图

以前写了个天气的APP,最近把他更新了一个版本,就抽取其中的天气温度折现图这个功能写了这篇博客,来与大家分享,希望对你有所帮助. 效果如图: 代码: MainActivity.Java /**** * 饼状图和天气折线图 */ public class MainActivity extends AppCompatActivity { private WeatnerChartView chart1; private WeatnerChartView chart2; private PinChart