基于邻接表建图的几种方法
最近做图的题比较多,除了克鲁斯卡尔和floyd,像广搜,普里姆,Bellman-Ford,迪杰斯特拉,SPFA,拓扑排序等等,都用到图的邻接表形式。
数据结构书上表示邻接表比较复杂,一般形式如下:
{
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; //邻接表结构体
其实有种简洁且高效的表示形式:
{
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]。
这样,在操作某个结点发出的边时,可以像这么做:
for(i = pre[now]; i != -1; i = edge[i].next)
{
int adj = edge[i].to;
int w = edge[i].w;
//do something...
}
其实,对于哈希表这类的存储结构(链表法解决冲突),与图的邻接表类似,也可以用类似的表示方法:
{
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
基于邻接表建图的几种方法相关推荐
- 【图论】关于邻接表建图
邻接表 作为一名现役Oier在做过无数图论题目和搜索题目之后,可以说是相当熟悉了,但是今天做的一道题,让我对于邻接表表示直接懵逼,原来在跑最短路的时候还是明白每个数组各自的作用的,然而一旦在其它题目中 ...
- vector邻接表建图+DFS+BFS
以边操作为主的图用边集数组存储比较好,相比链式前向星,vector建图更容易懂. #include <iostream> #include <cstdio> #include ...
- vector邻接表建图+dijkstra模板
本文节点的编号从0开始计算 思路 dijkstra伪算法(未优化)源点到自己的距离为0,其余点到源点的距离为无穷大 记录当前节点now为源点s 循环下面的步骤V次,V是结点的个数now标记已访问遍历n ...
- 迪杰斯特拉最全详解(朴素版,堆优化+邻接表存图/链式前向星存图)
迪杰斯特拉 迪杰斯特拉算法分析 迪杰斯特拉(朴素版) 迪杰斯特拉堆优化(邻接表存图) 迪杰斯特拉堆优化(链式前向星存图) 最短路--spfa(链式前向星存图) 迪杰斯特拉算法分析 一般用三种数据结构存 ...
- SDUT 2142 数据结构实验之图论二:基于邻接表的广度优先搜索遍历
数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Descript ...
- 【 第11关:基于邻接表的深度优先遍历】【编程题实训-图】【头歌】【bjfu-282】
任务描述 一个连通图采用邻接表作为存储结构.设计一个算法,实现从顶点v出发的深度优先遍历的非递归过程. 编程要求 输入 多组数据,每组m+2数据行.第一行有两个数字n和m,代表有n个顶点和m条边.顶点 ...
- mysql 邻接表_图的邻接表存储结构详解
通常,图更多的是采用链表存储,具体的存储方法有 3 种,分别是邻接表.邻接多重表和十字链表. 本节先讲解图的邻接表存储法.邻接表既适用于存储无向图,也适用于存储有向图. 在具体讲解邻接表存储图的实现方 ...
- QDUOJ 生化危机 邻接表存图+BFS
生化危机 发布时间: 2015年10月10日 18:05 时间限制: 1000ms 内存限制: 256M 描述 X博士想造福人类, 研发一种可以再生肢体的药物, 可是很不幸......研究失败 ...
- 【论文阅读记录】基于视觉SLAM建图的无人机路径规划 作者:王海
目录 一.论文前瞻问题 二.论文内容概述 1.SLAM建图与路径规划综述 2.关键问题 3.SLAM中前后端设计部分 4.三维路径规划 三.拓展 一.论文前瞻问题 智能体在陌生环境中的一次自主导航任务 ...
- 用邻接表存储图c语言,邻接表、邻接多重表、十字链表及C语言实现
上一节介绍了如何使用顺序存储结构存储邻接多重表和 邻接的意思是顶点之间有边或者弧存在,通过当前顶点,可以直接找到下一个顶点. 邻接表 使用邻接表存储图时,对于图中的每一个顶点和它相关的邻接点,都存储到 ...
最新文章
- 【Python】向函数传递列表
- 在python中查看关键字需要在python解释器中执行_现有代码 d={},在Python3解释器中执行 d[([1,2])] = 'b'得到的结果为( )。...
- js-forEach 不能使用break continue return true false
- Lec6-待学习的堆排序
- UILocalNotification详解
- 钉钉 php 推送,微信模板推送,钉钉信息推送
- java中super关键字的用法
- 化作春泥更护花的上一句是什么?化作春泥更护花作者是谁
- 「leetcode」57. 插入区间:【模拟插入】详细讲解!
- element ui中动态合并单元格_element ui单元格的动态合并
- ubuntu下安装jre 7
- oracle查询第三个字母是A的员工,oracle_day2 限制查询
- 华中师范大学计算机专硕和学硕,学硕?专硕?该如何选
- RAR文件格式学习(了解)
- 记住熊三木,一场关于文创产业“复兴十年” 的豪赌
- wps免费下载 wps文档怎么转成加密的PDF文档呢?
- 蓝桥杯真题系列:第十一届蓝桥杯C语言B组集锦
- python3.8安装mayavi4.7.3
- springcloud(瞿永超著)学习记录(更新中)
- 运行时:Linux 和 Windows 2000上的高性能编程技术
热门文章
- 人类为何喜欢十进制的数
- 在一台机器上使用gluster
- GstElement的sink/src有什么区别?
- python代码缩进中是否支持tab键和空格混用_python自测——编码规范
- ieee754标准_比特与信息在计算机中的表示及补码和浮点数的IEEE 754标准
- matlab中 晶闸管整流桥导通角_逆变角如何设置,matlab仿真模型作业
- nginx php转发_nginx做前端转发,将php交给php-fpm处理
- MySQL免安装版 图文教程【5.7版本,纯净版win7安装】
- delphi mysql类_Delphi MySQL数据库操作类
- 面向对象和面向过程的优劣