您的位置:首页 > 其它

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

2013-08-29 16:18 176 查看
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: