最近做图的题比较多,除了克鲁斯卡尔和floyd,像广搜,普里姆,Bellman-Ford,迪杰斯特拉,SPFA,拓扑排序等等,都用到图的邻接表形式。

数据结构书上表示邻接表比较复杂,一般形式如下:

typedef struct Node
{
    int dest;                    //邻接边的弧头结点序号
    int weight;                    //权值信息
    struct Node *next;            //指向下一条邻接边
}Edge;                            //单链表结点的结构体

typedef struct
{
    DataType data;                //结点的一些数据,比如名字
    int sorce;                    //邻接边的弧尾结点序号
    Edge *adj;                    //邻接边头指针
}AdjHeight;                        //数组的数据元素类型的结构体

typedef struct
{
    AdjHeight a[MaxVertices];    //邻接表数组
    int numOfVerts;                //结点个数
    int numOfEdges;                //边个数
}AdjGraph;                        //邻接表结构体

其实有种简洁且高效的表示形式:

typedef struct
{
    int to;
    int w;
    int next;
}Edge;
Edge e[MAX];
int pre[MAX];

//初始化
memset(pre,-1,sizeof(pre));

//输入
scanf("%d %d %d",&from,&to,&w1);
e[i].to = to; e[i].w = w1; e[i].next = pre[from]; pre[from] = i;
i++;

上面这段代码中,边的结构体Edge由三个元素组成:弧头结点序号,边权值,下一条边的序号。e[i]指的是第i条边。pre[i]记录的是从当前输入的情况来看,序号为i的弧尾结点发出的第一条边的序号是pre[i]。

这样,在操作某个结点发出的边时,可以像这么做:

/*now为弧尾结点序号,i为now所发出的边序号,adj为弧头结点序号,w为now-->adj这条边的权值*/
for(i = pre[now]; i != -1; i = edge[i].next)
{
     int adj = edge[i].to;
     int w = edge[i].w;
     //do something...
}

其实,对于哈希表这类的存储结构(链表法解决冲突),与图的邻接表类似,也可以用类似的表示方法:

typedef struct
{
    char e[11];    //value
    char f[11];     //key
    int next;        //下一个结果(hash冲突)
}Entry;
Entry entry[M];
int hashIndex[M];   //哈希值为M的结果集的第一个在entry中的序号。

//输入:对key进行hash,
sscanf(str,"%s %s",entry[i].e,entry[i].f);
int hash = ELFHash(entry[i].f);
entry[i].next = hashIndex[hash];
hashIndex[hash] = i;
i++;

//使用:
for(int k = hashIndex[hash]; k; k = entry[k].next)
{
    //do something..
}

转载自:http://yzmduncan.iteye.com/blog/883903

转载于:https://www.cnblogs.com/g0feng/archive/2012/09/18/2690913.html

基于邻接表建图的几种方法相关推荐

  1. 【图论】关于邻接表建图

    邻接表 作为一名现役Oier在做过无数图论题目和搜索题目之后,可以说是相当熟悉了,但是今天做的一道题,让我对于邻接表表示直接懵逼,原来在跑最短路的时候还是明白每个数组各自的作用的,然而一旦在其它题目中 ...

  2. vector邻接表建图+DFS+BFS

    以边操作为主的图用边集数组存储比较好,相比链式前向星,vector建图更容易懂. #include <iostream> #include <cstdio> #include ...

  3. vector邻接表建图+dijkstra模板

    本文节点的编号从0开始计算 思路 dijkstra伪算法(未优化)源点到自己的距离为0,其余点到源点的距离为无穷大 记录当前节点now为源点s 循环下面的步骤V次,V是结点的个数now标记已访问遍历n ...

  4. 迪杰斯特拉最全详解(朴素版,堆优化+邻接表存图/链式前向星存图)

    迪杰斯特拉 迪杰斯特拉算法分析 迪杰斯特拉(朴素版) 迪杰斯特拉堆优化(邻接表存图) 迪杰斯特拉堆优化(链式前向星存图) 最短路--spfa(链式前向星存图) 迪杰斯特拉算法分析 一般用三种数据结构存 ...

  5. SDUT 2142 数据结构实验之图论二:基于邻接表的广度优先搜索遍历

    数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Descript ...

  6. 【 第11关:基于邻接表的深度优先遍历】【编程题实训-图】【头歌】【bjfu-282】

    任务描述 一个连通图采用邻接表作为存储结构.设计一个算法,实现从顶点v出发的深度优先遍历的非递归过程. 编程要求 输入 多组数据,每组m+2数据行.第一行有两个数字n和m,代表有n个顶点和m条边.顶点 ...

  7. mysql 邻接表_图的邻接表存储结构详解

    通常,图更多的是采用链表存储,具体的存储方法有 3 种,分别是邻接表.邻接多重表和十字链表. 本节先讲解图的邻接表存储法.邻接表既适用于存储无向图,也适用于存储有向图. 在具体讲解邻接表存储图的实现方 ...

  8. QDUOJ 生化危机 邻接表存图+BFS

    生化危机 发布时间: 2015年10月10日 18:05   时间限制: 1000ms   内存限制: 256M 描述 X博士想造福人类, 研发一种可以再生肢体的药物, 可是很不幸......研究失败 ...

  9. 【论文阅读记录】基于视觉SLAM建图的无人机路径规划 作者:王海

    目录 一.论文前瞻问题 二.论文内容概述 1.SLAM建图与路径规划综述 2.关键问题 3.SLAM中前后端设计部分 4.三维路径规划 三.拓展 一.论文前瞻问题 智能体在陌生环境中的一次自主导航任务 ...

  10. 用邻接表存储图c语言,邻接表、邻接多重表、十字链表及C语言实现

    上一节介绍了如何使用顺序存储结构存储邻接多重表和 邻接的意思是顶点之间有边或者弧存在,通过当前顶点,可以直接找到下一个顶点. 邻接表 使用邻接表存储图时,对于图中的每一个顶点和它相关的邻接点,都存储到 ...

最新文章

  1. 【Python】向函数传递列表
  2. 在python中查看关键字需要在python解释器中执行_现有代码 d={},在Python3解释器中执行 d[([1,2])] = 'b'得到的结果为( )。...
  3. js-forEach 不能使用break continue return true false
  4. Lec6-待学习的堆排序
  5. UILocalNotification详解
  6. 钉钉 php 推送,微信模板推送,钉钉信息推送
  7. java中super关键字的用法
  8. 化作春泥更护花的上一句是什么?化作春泥更护花作者是谁
  9. 「leetcode」57. 插入区间:【模拟插入】详细讲解!
  10. element ui中动态合并单元格_element ui单元格的动态合并
  11. ubuntu下安装jre 7
  12. oracle查询第三个字母是A的员工,oracle_day2 限制查询
  13. 华中师范大学计算机专硕和学硕,学硕?专硕?该如何选
  14. RAR文件格式学习(了解)
  15. 记住熊三木,一场关于文创产业“复兴十年” 的豪赌
  16. wps免费下载 wps文档怎么转成加密的PDF文档呢?
  17. 蓝桥杯真题系列:第十一届蓝桥杯C语言B组集锦
  18. python3.8安装mayavi4.7.3
  19. springcloud(瞿永超著)学习记录(更新中)
  20. 运行时:Linux 和 Windows 2000上的高性能编程技术

热门文章

  1. 人类为何喜欢十进制的数
  2. 在一台机器上使用gluster
  3. GstElement的sink/src有什么区别?
  4. python代码缩进中是否支持tab键和空格混用_python自测——编码规范
  5. ieee754标准_比特与信息在计算机中的表示及补码和浮点数的IEEE 754标准
  6. matlab中 晶闸管整流桥导通角_逆变角如何设置,matlab仿真模型作业
  7. nginx php转发_nginx做前端转发,将php交给php-fpm处理
  8. MySQL免安装版 图文教程【5.7版本,纯净版win7安装】
  9. delphi mysql类_Delphi MySQL数据库操作类
  10. 面向对象和面向过程的优劣