【概念】疏松图&稠密图:

疏松图指,点连接的边不多的图,反之(点连接的边多)则为稠密图。

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;
}

图的存储结构:邻接矩阵(邻接表)&链式前向星的更多相关文章

  1. 邻接表&链式前向星

    链式前向星: 适合点多.边少的情况 不适用于大量遍历出边的题目(因为cache miss) 邻接表: 如果用邻接表来实现的话,一般就用vector嘛,我们都知道vector都是自动扩容的,在空间满了以 ...

  2. Floyd && Dijkstra +邻接表 +链式前向星(真题讲解来源:城市路)

    1381:城市路(Dijkstra) 时间限制: 1000 ms         内存限制: 65536 KB提交数: 4066     通过数: 1163 [题目描述] 罗老师被邀请参加一个舞会,是 ...

  3. 洛谷 P1352 没有上司的舞会【树形DP/邻接链表+链式前向星】

    题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...

  4. 单元最短路径算法模板汇总(Dijkstra, BF,SPFA),附链式前向星模板

    一:dijkstra算法时间复杂度,用优先级队列优化的话,O((M+N)logN)求单源最短路径,要求所有边的权值非负.若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的 ...

  5. 三种邻接表存图模板: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< ...

  6. 网络流dinic模板,邻接矩阵+链式前向星

    //这个是邻接矩阵的#include<iostream> #include<queue> #include<string.h> #include<stdio. ...

  7. Pants On Fire(链式前向星存图、dfs)

    Pants On Fire 传送门:链接  来源:upc9653 题目描述 Donald and Mike are the leaders of the free world and haven't ...

  8. UESTC30-最短路-Floyd最短路、spfa+链式前向星建图

    最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同 ...

  9. 最短路 spfa 算法 && 链式前向星存图

    推荐博客  https://i.cnblogs.com/EditPosts.aspx?opt=1 http://blog.csdn.net/mcdonnell_douglas/article/deta ...

随机推荐

  1. jQuery.cssHooks

    概述 直接向 jQuery 中添加钩子,用于覆盖设置或获取特定 CSS 属性时的方法,目的是为了标准化 CSS 属性名或创建自定义属性. $.cssHooks 对象提供了一种通过定义函数来获取或设置特 ...

  2. vue 2.0 无法编译ES6语法

    # vue2.0 webpack 无法编译 ES6 语法 之前在使用 vue 1.x 时用 vue-loader@8.0.0 版本可以正常打包vue的代码,包括ES6语法也能正常转为ES5语法,但是当 ...

  3. 记JavaScript的入门学习(三)

    2016.12.6晚上十点半完成JavaScript的第二章学习,看了点第三章的开头总述,都说原生js每一个知识点都可以分分钟钟让你放弃,而我在努力探索着.月末的时候就回家放假了,希望在家也可以有个小 ...

  4. POJ 3139 Balancing the Scale

    枚举. 看了这个方法:$http://www.cppblog.com/shiming413/archive/2008/12/21/29671.html$ 将数字归类的地方不能用$vector$,会超时 ...

  5. http请求的概念

    我曾多次阅读http协议,但是理解依然不深,在此,再次阅读,再次理解.加深两点:解析头部信息\r\n,分解头部和主体用\r\n\r\n.之所以一次请求会看到网络里有很多请求,是因为浏览器代替访问了多次 ...

  6. 1、<img />标签

    alt:当图片不显示时的文字说明 title:鼠标悬停在图片上的出现的文字说明

  7. MySQL千万级数据JDBC插入

    案例语句: String sql = "LOAD DATA LOCAL INFILE '" + dataFilepath + "' into table " + ...

  8. BFS,DFS伪代码

    //bfs #define queue_init (head=tail=0) #define queue_is_empty (head==tail) #define en_queue(x) (queu ...

  9. 数数字(Digit Counting,ACM/ICPC Danang 2007,UVa1225)

    #include<stdio.h>#include<stdlib.h>#include<string.h>int main(){ char s[10000]; in ...

  10. vsftp建立虚拟用户不同目录分配不同权限操作步骤详解

    vsftpd服务器同时支持匿名用户.本地用户和虚拟用户三类用户账号,使用虚拟用户账号可以提供集中管理的FTP根目录,方便了管理员的管理,同时将用于FTP登录的用户名.密码与系统用户账号区别开,进一步增 ...