图的存储结构-邻接表-边集数组-前向星
2013-08-29 16:18
176 查看
1.【邻接表】
是一种图的存储结构,适用于点多边少的稀疏图。
缺点:若要删除(V0,V2)这条边,就需要对邻接表结构中边表的两个结点进行删除操作。
![](https://img-blog.csdn.net/20130829161233687?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VucXVhbmE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
2.【边集数组】
边集数组是由两个一维数组构成,一个是存储顶点的信息,另一个是存储边的信息,这个边数组每个数据元素由一条边的起点下标(begin),终点下标(end)和权(weight)组成。
![](https://img-blog.csdn.net/20130829161834812?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VucXVhbmE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
3.【前向星】
前向星是一个边集数组,把边的起点终点和权值存起来,然后以起点从小到大或者从大到小排序,记录每个顶点在数组中的起始位置和长度.。适用于点多边少的稀疏图,或两点之间有多条弧的时候。
下面介绍一下链式前向星构造方法如下:
(1)每读入一条边i的信息
(2)将边的终点和权值存放在数组中
(3)把该条边的next=headlist[a]。
前向星就构造完了.(跟邻接表的实现一样,只是没存储起点)
![](https://img-blog.csdn.net/20130829172354765?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VucXVhbmE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20130829172905296?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VucXVhbmE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define maxedge 20000
#define maxn 5000 //结点数
#define inf 1<<28
bool vist[maxn];
struct Edge
{
// int s; //边的起点
int t; //边的终点
int next;//当前下一条边的编号
int w; //边的权值
}edge[maxedge];
int headlist[maxedge]; //索引 head[i]存放已i为起点的“第一条”边
int n,m;
//输出前向星存储的图
void show_graph()
{
int i,k;
for(i=1;i<=n;i++)
{
for(k=headlist[i];k!=-1;k=edge[k].next)
{
printf("(%d --- > %d)==%d\n", i, edge[k].t, edge[k].w);
}
}
}
int main()
{
int i,a,b,c;
while(~scanf("%d%d",&n,&m))
{
for(i=1;i<=n;++i)
headlist[i]=-1;
for(i=1;i<=m;++i)
{
scanf("%d%d%d",&a,&b,&c);
//edge[i].s=a;
edge[i].t=b;
edge[i].w=c;
edge[i].next=headlist[a];//索引:节点i 后一条边编号为headlist[a];
headlist[a]=i;
}
show_graph();
}
return 0;
}
是一种图的存储结构,适用于点多边少的稀疏图。
缺点:若要删除(V0,V2)这条边,就需要对邻接表结构中边表的两个结点进行删除操作。
2.【边集数组】
边集数组是由两个一维数组构成,一个是存储顶点的信息,另一个是存储边的信息,这个边数组每个数据元素由一条边的起点下标(begin),终点下标(end)和权(weight)组成。
3.【前向星】
前向星是一个边集数组,把边的起点终点和权值存起来,然后以起点从小到大或者从大到小排序,记录每个顶点在数组中的起始位置和长度.。适用于点多边少的稀疏图,或两点之间有多条弧的时候。
下面介绍一下链式前向星构造方法如下:
(1)每读入一条边i的信息
(2)将边的终点和权值存放在数组中
(3)把该条边的next=headlist[a]。
前向星就构造完了.(跟邻接表的实现一样,只是没存储起点)
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define maxedge 20000
#define maxn 5000 //结点数
#define inf 1<<28
bool vist[maxn];
struct Edge
{
// int s; //边的起点
int t; //边的终点
int next;//当前下一条边的编号
int w; //边的权值
}edge[maxedge];
int headlist[maxedge]; //索引 head[i]存放已i为起点的“第一条”边
int n,m;
//输出前向星存储的图
void show_graph()
{
int i,k;
for(i=1;i<=n;i++)
{
for(k=headlist[i];k!=-1;k=edge[k].next)
{
printf("(%d --- > %d)==%d\n", i, edge[k].t, edge[k].w);
}
}
}
int main()
{
int i,a,b,c;
while(~scanf("%d%d",&n,&m))
{
for(i=1;i<=n;++i)
headlist[i]=-1;
for(i=1;i<=m;++i)
{
scanf("%d%d%d",&a,&b,&c);
//edge[i].s=a;
edge[i].t=b;
edge[i].w=c;
edge[i].next=headlist[a];//索引:节点i 后一条边编号为headlist[a];
headlist[a]=i;
}
show_graph();
}
return 0;
}
相关文章推荐
- 数据结构之图的存储表示(邻接矩阵、邻接表和边集数组)
- 【数据结构】图的存储方式:邻接矩阵和邻接表
- 数据结构:图的存储结构之邻接表
- 图的邻接表存储结构及求各顶点的度
- 图的存储结构(邻接表)
- 数据结构之图的邻接表存储(参考C博客—研究毛)
- 【数据结构】图的存储方式:邻接矩阵和邻接表
- 16 - 12 - 26 图的存储结构-邻接矩阵、邻接表、十字链表
- 数据结构之自建算法库——图及其存储结构(邻接矩阵、邻接表)
- 图的存储结构-邻接表
- 图的存储结构(十字链表、邻接多重表、边集数组)- 数据结构和算法58
- 图的存储结构(邻接表)
- 【数据结构】图的存储方式:邻接矩阵和邻接表
- 关于图的存储方法 (静态邻接表、前向星、边集数组)
- 数据结构—图的存储—邻接表和邻接矩阵
- 【数据结构】图邻接表存储实现
- 以邻接表为存储结构的---图的算法实现
- 第十一周——项目一—图及其存储结构(邻接矩阵、邻接表)算法库
- 图的邻接表存储结构
- 数据结构:图的存储结构之邻接表