图的3种储存方式

图的储存方式有三种

一。邻接矩阵  

  优点:简洁明了,调用方便,简单易写;

  缺点:内存占用大,而且没办法存重边(可能可以,但我不会),点的个数超过 3000 直接爆炸

  适用范围:点的个数少,稠密图,一般结合floyed使用,可以传递闭包。

  代码:

    scanf("%d%d",&u,&v,&w);
    a[u][v]=w;
    a[v][u]=w;// 双向边

二。邻接表

  优点:占用空间小,可以快速查找每个点的出度,重边可以存,写着较为方便

  缺点:查找和删除边很不方便,对于无向图,如果需要删除一条边,就需要在两个链表上查找并删除,用了STL,速度会慢

  适用范围:大部分情况,不要求删除边就行

  代码:

struct Edge{
    int v,w;
};vector <Edge> edge[maxn];
void addedge(int u,int v,int w)
{
    edge[u].push_back({v,w});
    edge[v].push_back({u,w});//双向边
}

三。链式前向星

  优点:比邻接表还省空间,可以解决某些卡空间的问题,删除边也很方便,只需要更改next指针的指向即可,速度也快

  缺点:好像就是写的麻烦,理解麻烦,性能好像很猛

  适用:需要删除边的题目,速度时间都要求高的题目

  代码:

struct Edge{
    int to,w,next;
}edge[maxn*2];
int cnt,head[maxn],s,t,n,m;
void addedge(int u,int v,int w)
{
    edge[++cnt].to=v;
    edge[cnt].w=w;
    edge[cnt].next=head[u];
    head[u]=top;
}
struct Pre{
    int v,edge;
}pre[maxn];

  解释:这是比较难理解的一种方式,所以做一下解释,主要是看别人的博客看懂的

  对于上图,输入为

  1 2

  2 3

  3 4

  1 3

  4 1

  1 5

  4 5

  对于上面的结构体,  其中edge[i].to表示第i条边的终点  ,edge[i].next表示与第i条边同起点的下一条边的存储位置,  edge[i].w为边权值.

  数组head[],它是用来表示以i为起点的第一条边存储的位置, head[]数组一般初始化为-1 实际上你会发现这里的第一条边存储的位置其实在以i为起点的所有边的最后输入的那个编号.

  有了以i为起点的第一条边的储存位置和同起点下一条边的储存位置我们就可以便利这个i点的每一条边了

  

  初始化cnt = 0,这样,现在我们还是按照上面的图和输入来模拟一下:

  edge[0].to = 2;     edge[0].next = -1;      head[1] = 0;

  edge[1].to = 3;     edge[1].next = -1;      head[2] = 1;

  edge[2].to = 4;     edge[2],next = -1;      head[3] = 2;

  edge[3].to = 3;     edge[3].next = 0;       head[1] = 3;

  edge[4].to = 1;     edge[4].next = -1;      head[4] = 4;

  edge[5].to = 5;     edge[5].next = 3;       head[1] = 5;

  edge[6].to = 5;     edge[6].next = 4;       head[4] = 6;

  很明显,head[i]保存的是以i为起点的所有边中编号最大的那个,而把这个当作顶点i的第一条起始边的位置.

  这样在遍历时是倒着遍历的,也就是说与输入顺序是相反的,不过这样不影响结果的正确性.

  比如以上图为例,以节点1为起点的边有3条,它们的编号分别是0,3,5   而head[1] = 5

  我们在遍历以u节点为起始位置的所有边的时候是这样的:

  

  for(int i=head[u];~i;i=edge[i].next)

  那么就是说先遍历编号为5的边,也就是head[1],然后就是edge[5].next,也就是编号3的边,然后继续edge[3].next,也就是编号0的边,可以看出是逆序的.

  

第三部分引用了https://blog.csdn.net/ACdreamers/article/details/16902023 感谢原作者

原文地址:https://www.cnblogs.com/ztdf123/p/11391062.html

时间: 2024-11-05 16:07:44

图的3种储存方式的相关文章

图的种类及储存方式

一.图的种类(以下的分类不是并列的) 1.有向图:图中边的方向是一定的,不能逆序走. 2.无向图:图中的边没有方向,可以逆序走.没有正负方向 3.完全图:完全图:对于顶中的每一个顶点,都与其他的点有边直接相连 无向完全图:编辑任意一个具有n个结点的无向简单图,其边数小于等于n*(n-1)/2;我们把边数恰好等于n*(n-1)/2的n个结点的无向图称为完全图. 有向完全图:在一个n个结点的有向图中,最大边数为n*(n-1). 4.稀疏图和稠密图:一般的对于一个图来说,边的数目多的就是稠密图,边的数

图的两种遍历方式

图的遍历有两种:深度优先和广度优先.本文中,深度优先使用递归实现,每次递归找到第一个与当前结点相连且未输出过的结点继续往下递归,直至所有结点都已输出.广度优先将开始结点的所有邻接结点全部压入栈,当栈不为空时一直循环将栈首的结点的所有相邻结点压入栈. 具体代码实现如下: 1 //邻接链表 2 class Graph { 3 private: 4 //n: number of nodes 5 int n; 6 vector<int> *edges; 7 bool *visited; 8 publi

图的几种存储方式

1,     邻接矩阵: struct MGraph { int ver[Max]; int arc[Max][Max]; int vers; int Eges; }; int Locate(MGraph G,int x) { for(int i=1;;i++) if(G.ver[i]==x) return i; } void CreateUDN_MG(MGraph &G) { cin>>G.vers>>G.Eges; for(int i=1;i<=G.vers;i+

Android下的数据储存方式( 二)

  在上一篇文章中我们介绍了SharedPreferences的使用方法. 今天我们继续介绍另一种储存数据的方式:使用内部储存和外部储存   每一个Android设备都拥有两个数据储存区域:外部储存和外部储存 那么我们应该采用哪种储存方式呢? 我们先对比一下这两种储存方式的不同: 内部储存: 总是可用的 保存在这里的文件只能被你的app访问 当程序被卸载的时候,系统会删除所有属于该应用的文件 当你不希望你的文件被其他人或应用访问到的时候,内部储存是最好的选择 外部储存: 当sd卡被用户卸载的时候

HTML中设置背景图的两种方式

HTML中设置背景图的两种方式 1.background    background:url(images/search.png) no-repeat top; 2.background-image    background-image:url(images/search.png):    background-repeat:no-repeat;

Android数据的四种存储方式

很清晰的思路,转自Android数据的四种存储方式 作为一个完成的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File.由于Android系统中,数据基本都是私有的的,都是存放于“data/data/程序包名”目录下,所以要实现数据共享,正确方式是使用Content Provider. SQLite: SQLite是一个轻量级的数据库,支持基本SQL语法,是常被采用

PHP中的Session储存方式优化

1:查看当前PHP版本中Seesion支持的储存方式   可以看出当前Session支持的储存方式有以下几种 files:文件模式,PHP默认的储存方式,把储存的值放在服务器的指定目录里 user:用户模式,暂时不了解 redis:支持redis储存.通过上面的图,可以看出当前session是redis储存,并指定了连接信息 memcache:支持memcache储存 2:redis|memcache储存的配置方式(支持redis|memcache拓展) 一:php.ini配置(推荐) sess

利用图形窗口分割法将极坐标方程:r=cos(θ/3)+1/9用四种绘图方式画在不同的窗口中

利用图形窗口分割法将极坐标方程:r=cos(θ/3)+1/9用四种绘图方式画在不同的窗口中. 解:MATLAB指令: theta=0:0.1:6*pi;rho=cos(theta/3)+1/9; >> polar(theta,rho) >> >> plot(theta,rho) >> semilogx(theta,rho) >> grid >> hist(rho,15) 结果分别如下图: 图1 图2 图3 图4

MyEclipse中web服务器的三种配置方式

初学Javaweb开发的人们都会遇到一个问题,就是服务器环境的搭建配置问题.下面介绍三种服务器的搭建方式. 直接修改server.xml文件 当你写了一个web应用程序(jsp/servlet),想通过浏览器直接去访问这个页面,需要在Tomcat中配置相关路径: 找到Tomcat下conf目录,你会看到有个server.xml,即服务器配置文件.用文本编译器打开,拉到Host标签,在它结束前加上我们的应用程序路径: <Context path="/HelloWeb" docBas