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;
}