图的存储结构-邻接表-边集数组-前向星

1.【邻接表】 

是一种图的存储结构,适用于点多边少的稀疏图。

缺点:若要删除(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;
}











版权声明:本文为yibcs原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。