浅谈图的前向星遍历

个人见解,如有错误,欢迎指出。

作为一个算法新手,我就从我个人的角度来讲述前向星这种算法,我看到大多数都是建立一个边集的结构体,然后在结构体内放入边指向结点,边的前驱,和边权:

例如:

struct edge{//建立一个边集结构体
    int next;//好一点的把next换成了pre,从字面上来讲更好理解
    int w;//边的权值
    int v;//边指向结点,有的写成to
}e[maxn];

当然对于一个已经懂得了前向星的人来讲,这种写法也还是比较好理解的。下面进入主题:

同样的我们还是建立一个结构体,但是,我们把名字改成graph,没错,就是graph。表明我们是对一个图进行操作。

由于前向星是一种反向遍历的方式,我们把相应的next和v改成front和to,这样从字面生更好理解。我们按输入顺序对每条边赋予一个值,表明是第几条输入边(也就是说每条边都有一个独一无二的IP地址了)

即:使用链表方式存储图的边。last[i]用来记录以i为起点且为最后输入的一条边,front[j] 表示边j的前一条边(这里的前一条边不仅仅是指输入顺序在j的前面,而且还得和j拥

有相同的起点),to[j]表示第j条边所指向的结点编号。即:令addr=last[i],之后不断用 addr=front[addr]即可得到链表中所有以结点i为起点的所有“边集的编号”,其中

to[addr]表示对应边指向的结点编号。那么这样做有什么用呢?比如我们想知道有没有一条从u到v的边,我们只需要这样遍历所有从u出发的边,看有无终点是v即可。

代码:

struct graph{
    int last[maxn],front[maxn],to[maxn],w[maxn],cnt;
    void init(){//初始化
        memset(front,-1,sizeof(front));//-1表示某条边不存在前驱边
        memset(to,0,sizeof(to));
        memset(last,0,sizeof(last));
        cnt=0;
    }
    void add(int u,int v,int W){
        cnt++;//使边的编号从1开始
        to[cnt]=v;//记录该边的指向结点
        w[cnt]=W;//记录该边的权值
        front[cnt]=last[u];//用尾插法把该边放入以u为起点的边集中
        last[u]=cnt;//更新以u为起点且为最后输入的边
        //如果是无向图,加入下面这句话
        /*
        swap(u,v);
        cnt++;
        to[cnt]=v;
        w[cnt]=W;
        front[cnt]=last[u];
        last[u]=cnt;
        */
    }
}G;

好了我的讲述就到这里了吧,个人认为这种写法还是比较好理解的,代码嘛也不是很长。

时间: 2024-10-09 05:42:04

浅谈图的前向星遍历的相关文章

图存储-前向星

//前向星是将所有的边进行编号,每个节点u的边集合通过head[u]来找到u的第一条边, //再通过next[head[u]]依次遍历节点u的所有边. int head[maxn]; int to[maxn*2]; int next[maxn*2]; int cnt = 0;//边的编号 memset(head, -1, sizeof(head)); inline void add(int x,int y){ to[cnt]=y,next[cnt]=head[x],head[x]=cnt++;

浅谈图的广度优先遍历

一.广度优先遍历 上次我们浅谈了图的深度优先遍历,接下来我们使用广度优先搜索来遍历这个图: 这五个顶点被访问的顺序如下图所示: 二.实现过程 广度优先搜索过程如下: 首先以一个未被访问过的顶点作为起始顶点,比如以1号顶点为起点. 将1号顶点放入到队列中,然后将与1号顶点相邻的未访问过的顶点,即2号.3号和5号顶点依次放入到队列中. 接下来再将2号顶点相邻的未访问过的4号顶点放入到队列中. 到此所有顶点都被访问过,遍历结束. 广度优先遍历的主要思想: 首先以一个未被访问过的顶点作为起始顶点,访问其

浅谈图的深度优先遍历

一.图的深度优先概述 图,就是由一些小圆点(称为顶点)和连接这些小圆点的直线(称为边)组成的.例如: 上图是由五个顶点(编号为1.2.3.4.5)和五条边(1-2.1-3.1-5.2-4.3-5)组成. 现在我们从1号顶点开始遍历这个图(遍历指的是把每一个顶点都访问一次).使用深度优先搜索来遍历这个图我们将得到以下结果: 使用深度优先搜索来遍历这个图的具体过程是: 首先从一个未走到过的顶点作为起始顶点,比如1号顶点作为起点. 沿1号顶点的边去尝试访问其它未走到过的顶点,首先发现2号顶点还没有走到

PTA L2-023 图着色问题-前向星建图 团体程序设计天梯赛-练习集

L2-023 图着色问题 (25 分) 图着色问题是一个著名的NP完全问题.给定无向图,,问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色? 但本题并不是要你解决这个着色问题,而是对给定的一种颜色分配,请你判断这是否是图着色问题的一个解. 输入格式: 输入在第一行给出3个整数V(0).E(≥)和K(0),分别是无向图的顶点数.边数.以及颜色数.顶点和颜色都从1到V编号.随后E行,每行给出一条边的两个端点的编号.在图的信息给出之后,给出了一个正整数N(≤),是待

前端架构浅谈

前端架构浅谈 0.前注 鉴于作者本人的能力有限(非常有限),并且依然在学习中,因此本文的高度和深度必然有所欠缺. 欢迎(并且非常欢迎)大家来批评指正,如果能详细的说明问题在哪里,如何解决和改正,那么就太感谢了!!! 我最喜欢听有理有据的批评了!! 本人QQ:20004604,邮箱:[email protected],期待你的交流. 1.为什么要有一个好的架构 首先明确一点,架构是为需求服务的. 前端架构存在的目的,就我个人理解来说,有以下几点: 1.提高代码的可读性. 一个好的架构,代码的可读性

poj-1459-最大流dinic+链式前向星

title: poj-1459-最大流dinic+链式前向星 date: 2018-11-22 20:57:54 tags: acm 刷题 categories: ACM-网络流-最大流 概述 这道是一道网络流里最大流的板子题,,, 暑期集训网络流草草水过,,连基本的算法都不知道有哪些,,,更别提怎么实现了,,,只知道网络流的大致的概念,, 今天花了一天的时间重新学习了一波,,,本以为这东西很简单,,,没想到不仅算法的实现一大堆的东西,,就连题目都有时候看不懂,,,,感受就是网络流的题不仅算法实

【模板】链式前向星

用于存图的结构 在标准里,用于网络流的前向星和正常存图的前向星有区别 1 #define maxn 1000 2 struct qxx//用于正常存图 3 { 4 int tot,fr[maxn],to[maxn],nxt[maxn],w[maxn]; 5 void adde(int p,int q,int W) 6 {to[++tot]=q; w[tot]=W; nxt[tot]=fr[p]; fr[p]=tot;} 7 }; 8 ///////////////////////////////

浅谈前向星

现在才搞懂前向星的遍历,原来是要从后往前的!之后的一切都是以此为基础的. 1.前向星的遍历 看到有一篇blog写的不错:http://blog.csdn.net/acdreamers/article/details/16902023 1 2 2 3 3 4 1 3 4 1 1 5 4 5 那么排完序后就得到: 编号:     1      2      3      4      5      6      7 起点u:    1      1      1      2      3    

图的存储结构:邻接矩阵(邻接表)&链式前向星

[概念]疏松图&稠密图: 疏松图指,点连接的边不多的图,反之(点连接的边多)则为稠密图. Tips:邻接矩阵与邻接表相比,疏松图多用邻接表,稠密图多用邻接矩阵. 邻接矩阵: 开一个二维数组graph[ ][ ]来记录图中点a与点b之间是否连通,初始化为0(或者-1之类的看情况):如果图中有可忽略的重边(如 只需重边中的最小边或最大边),则保存需要的那条边的边权,但如果有无法忽略的重边,就一定不要用邻接矩阵. int graph[MAXN][MAXN]; void graphInit() { me