前向星
Posted zdl2234
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前向星相关的知识,希望对你有一定的参考价值。
前向星一种数据结构,以储存边的方式来存储图。构造方法如下:读入每条边的信息,将边存放在数组中,把数组中的边按照起点顺序排序(如果是链式存储则不用排序),前向星就构造完了。
1. 非链式
首先通过建立数组存储边;
然后对数组按起点从小到大排序;
用len[i]来记录所有以i为起点的边在数组中的存储长度;
用head[i]记录以i为边集在数组中的第一个存储位置;
通过以上信息就可以存储图的所有信息;
2. 链式(通过数组模拟链表)
//结构体 struct EDGE{ int to,w,next;//v表示边的终点,w表示边的权值,next表示与这条边相同起点的下一条边 }edge[200010];
如何存储:
//如果为无向图则添加两条边
void addedge(int s,int t,int w){//s表示起点,t表示终点,w表示权值 edge[pos].to=t;//存这条边的终点,pos表示第几条边,起点没有特殊需求可以不存,因为后面head[]可以存储起点信息
edge[pos].w=w;//存储边的权值 edge[pos].next=head[s];//存下以这条边同起点的另一条边,通过边连边达到链式的效果,如果是首条边则存-1,当遍历到-1是就表示把所有同起点的边遍历完了。 head[s]=pos++; //通过一直更新head[s]的值,使head[s]指向最后一条添加的以s为起点的边,遍历时就从最后添加的这条边往前面添加的遍历
}
遍历:
非递归:
for(int i = 1 ; i <= n ; i ++){ for(int k = head[i] ; k != -1 ; k = Edges[k].next){ cout << i << " " << Edges[k].to << " " << Edges[k].w << endl; } }
递归:
int flag[_Max];//下标表示对应的边,值为0表示未访问过,值为1表示访问过了
void dfs(int s){
if(head[s]==-1) return;
for(int k=head[s];k!=-1;k = Edges[k].next){
if(flag[k]==1) continue;
cout << s << " " << edges[k].to << " " << Edges[k].w << endl;
flag[k]=1;
dfs(edges[k].to);
}
}
以上是关于前向星的主要内容,如果未能解决你的问题,请参考以下文章