前向星:是一种数据结构,以储存边打方式来存储图。构造方法,读入每条边的信息将边存放在数组中把数组中的边按照起点顺序排序排序,前向星就构造完量。通常用在点的数目太多,或两点之间有多条弧的时候。一般在别的数据结构不能使用的时候才考虑用前向星。除了不能直接用起点终点定位以外,前向星几乎是完美的。
「·任务·」
以前向星方式存储一个有向图打基本信息
「·说明·」
使用链表方式存储图的边。info[i]为节点i的边集所对应的链表的头指针,next[j]为第j条边的指向下一条边的指针,to[j]表示第j条边所指向的节点编号。即:令addr=info[i],之后不断用addr=next[addr]即可得到链表中节点i的所有边集的编号,其中to[addr]表示对应边指向的节点编号。
「·接口·」
结构体:graph
成员变量:
vector < int > info 由该点出发的所有边构成打链表
vector < int > next 链表中下一条边在to数组中的位置
vector < int > to to[i]表示编号位i的边指向打节点
「·代码·」
struct graph
{
typedef vector<int> VI;
VI info,next,to;
graph (int n=0,int m=0) : to(0),next(0)
{
info.resize(n);
next.reserve(m);
to.reserve(m);
}
int edge_size()
{
return to.size();//返回边的数量
}
int vertex_size()
{
return info.size();//返回值为最大点打编号+1
}
void expand(int i)
{
if (info.size()<i+1)
info.resize(i+1);
}
void add(int i,int j)//添加一条i到j的边
{
expand(i),expand(j);
to.push_back(j);
next.push_back(info[i]);
info[i]=to.size()-1;
}
void del_back()//删除最后一次添加打边
{
int i;
for (i=0;i<info.size();i++)
{
if (info[i]==to.size()-1)
{
info[i]=next.back();
break;
}
}
to.pop_back();
next.pop_back();
}
void clear()//清空类图
{
info.clear();
next.resize(0);
to.resize(0);
}
};
本文介绍了一种称为“前向星”的数据结构,用于高效地存储有向图的边集合。通过使用链表的方式存储边的信息,可以方便地进行图的遍历操作。文章详细解释了前向星的基本概念、构造方法及其应用场景。
1686

被折叠的 条评论
为什么被折叠?



