图的存储结构:邻接矩阵(邻接表)&链式前向星
【概念】疏松图&稠密图:
疏松图指,点连接的边不多的图,反之(点连接的边多)则为稠密图。
Tips:邻接矩阵与邻接表相比,疏松图多用邻接表,稠密图多用邻接矩阵。
邻接矩阵:
开一个二维数组graph[ ][ ]来记录图中点a与点b之间是否连通,初始化为0(或者-1之类的看情况);如果图中有可忽略的重边(如 只需重边中的最小边或最大边),则保存需要的那条边的边权,但如果有无法忽略的重边,就一定不要用邻接矩阵。
- int graph[MAXN][MAXN];
- void graphInit()
- {
- memset(graph,0,sizeof(graph));
- }
- void graph_addEdge(int from,int to)
- {
- graph[from][to]=1;
- //如果是有边权的图,把权值赋给graph[from][to]
- //如果是无向无重边图,可以写成graph[from][to]=graph[to][from]=X(对称矩阵);
- }
邻接表:
依旧给每个节点编号,邻接表就是在结构体里声明一个to,由点a指向所连接的点b,就是vertex[a].to.push_back(b);记得要初始化。
而且,因为邻接表是用vector存边(push_back),所以不必担心重边丢失的情况;不过,使用邻接表存储图的话,对于两点之间是否连通的查询,相比邻接矩阵,邻接表处于劣势(因为在邻接表里必须遍历整个当前点的to才能判断是否与另一点连通)。
- //用vector实现
- struct node
- {
- vector<int> to;
- //如果要挂边权,就在结构体里增加 int val;即可
- }vertex[MAXN];
- void graph_init(int n)
- {
- for(int i=1;i<=n;i++)
- vertex[i].to.clear();
- }
- void graph_addEdge(int from,int to)
- {
- vertex[from].to.push_back(to);
- //如果是无向边,则写成以下两步:
- //vertex[from].to.push_back(to);
- //vertex[to].to.push_back(from);
- }
链式前向星:
本质上是图上所有边以某种特殊方式组成的链表。
通过加边方法,可以知道,如何查询一个点连出的边的方法:
要查询一个点的连出边,我们要先查head,知道这个点最近添加的那条边在哪里(查询结果在这里是j),然后比这条边早一些添加的就是next[j],再早一点的就是next[next[j]],更早一点的是next[next[next[j]]],再早一点的是……,就这样我们一直往时间添加时间更早的边查,直到查到空节点(用来标记链表结束)。
以下是链式前向星的模板,含加边操作、遍历操作的方法:
- struct Graph
- {
- int head[MAXN]; //每一个节点在容器(数组)中所对应的第一条边的位置
- int next[MAXN]; //每一条边在容器中所对应的同一起点的下一条边的位置
- int to[MAXN]; //真正存储某一条边指向哪一点
- //若要知道每条边的起点,还需开一个数组from[MAXN];
- inline void addEdge(int _from,int _to)
- {
- //加边的方法
- static int q=1;
- //q是静态变量,每次加边,都首先用q指示当前存储边的容器末端(暗示已经为end)
- to[q]=_to; //在to的末端写入新加边的信息
- next[q]=head[_from];
- //head[_from]表示起点_from最近添加的一条边的位置,然后让新加边的next指向该边的位置
- head[_from]=q++;
- //修改head,使得最近添加的边更新为新边,同时末端向后移动(q++;)以供下一次添加使用
- }
- } graph;
- void iteration()
- {
- //遍历的方法
- int now; //now 是当前所处的节点编号
- for (int j=idx.head[now]; j; j=idx.next[j])
- {}
- //operate node j,j是now所连接的节点编号
- }
上面注释太多,下面上一个比较实用的模板( ̄▽ ̄)" :
- struct edge
- {
- int next,to;
- }E[MAXN];
- int head[MAXN],Ecou; //Ecou:边下标
- void add_edge(int u,int v)
- {
- E[Ecou].to=v;
- E[Ecou].next=head[u];
- head[u]=Ecou++;
- }
- void init(int n)
- {
- Ecou=0;
- //memset(head,-1,sizeof(head);
- for(int i=1;i<=n;i++)
- head[i]=-1;
- }
图的存储结构:邻接矩阵(邻接表)&链式前向星的更多相关文章
- 邻接表&链式前向星
链式前向星: 适合点多.边少的情况 不适用于大量遍历出边的题目(因为cache miss) 邻接表: 如果用邻接表来实现的话,一般就用vector嘛,我们都知道vector都是自动扩容的,在空间满了以 ...
- Floyd && Dijkstra +邻接表 +链式前向星(真题讲解来源:城市路)
1381:城市路(Dijkstra) 时间限制: 1000 ms 内存限制: 65536 KB提交数: 4066 通过数: 1163 [题目描述] 罗老师被邀请参加一个舞会,是 ...
- 洛谷 P1352 没有上司的舞会【树形DP/邻接链表+链式前向星】
题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...
- 单元最短路径算法模板汇总(Dijkstra, BF,SPFA),附链式前向星模板
一:dijkstra算法时间复杂度,用优先级队列优化的话,O((M+N)logN)求单源最短路径,要求所有边的权值非负.若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的 ...
- 三种邻接表存图模板:vector邻接表、数组邻接表、链式前向星
vector邻接表: ; struct Edge{ int u,v,w; Edge(int _u=0,int _v=0,int _w=0){u=_u,v=_v,w=_w;} }; vector< ...
- 网络流dinic模板,邻接矩阵+链式前向星
//这个是邻接矩阵的#include<iostream> #include<queue> #include<string.h> #include<stdio. ...
- Pants On Fire(链式前向星存图、dfs)
Pants On Fire 传送门:链接 来源:upc9653 题目描述 Donald and Mike are the leaders of the free world and haven't ...
- UESTC30-最短路-Floyd最短路、spfa+链式前向星建图
最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同 ...
- 最短路 spfa 算法 && 链式前向星存图
推荐博客 https://i.cnblogs.com/EditPosts.aspx?opt=1 http://blog.csdn.net/mcdonnell_douglas/article/deta ...
随机推荐
- js实现文本框或文本域在用户输入时(oninput)触发事件,操作元素
写在前面:给不同的文本框设定同样的效果,当文本框没有内容输入时,‘下一步’按钮不可用且透明度为0.5.当有内容输入时(并不是获得焦点时focus),‘下一步’按钮状态可用, 且透明度为1. <s ...
- Selenium WebDriver多层表单切换
[Java] 首先 测试网站frame结构为 -topframe: -centerframe: -leftframe: -mainframe: -bottomframe: 我当时遇到的问题是,首先在c ...
- nginx服务器上遇到了acces denied,报错是fastCGI只要好好修改配置就行了
猜想: 懵逼 实践: 首先通用的方法,并没有解决问题. 1.修改php-fpm配置文件vim /etc/php-fpm.d/www.confuser = nginx 编辑用户为nginx ...
- sql 时间格式化
sql server2000中使用convert来取得datetime数据类型样式(全) 日期数据格式的处理,两个示例: CONVERT(varchar(16), 时间一, 20) 结果:2007-0 ...
- C# LogHelper
using System; using log4net; using log4net.Config; namespace Utils { /// <summary> /// 日志帮助类(l ...
- 【css2、css3】css改变select选择框的样式
效果: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- delphi 程序输出文件夹存放位置
- python字符串及正则表达式[转]
原文链接:http://www.cnblogs.com/guojidong/archive/2012/12/20/2826388.html 字符串: 正则表达式 正则表达式元字符与语法图: 注意事项: ...
- iOSAPP添加启动页
如果你在开发过程中出现屏幕显示内容比例不正常或者显示不全的问题,你发现不是代码或者约束的问题,那么很可能是启动页没有添加或者添加不全的原因,下面配一张问题图片上下黑屏 添加启动页步骤如下图 (1) ( ...
- pymongo数据报表脚本
最近打算将平时自己的一些小工具整理整理,由于一直使用python写脚本,而且数据库一直使用MongoDB,所以直接使用pymonogo驱动数据库做一些报表生成的小脚本,此次的脚本主要针对每个月中公司业 ...