前向星

前向星一种数据结构,以储存边的方式来存储图。构造方法如下:读入每条边的信息,将边存放在数组中,把数组中的边按照起点顺序排序(如果是链式存储则不用排序),前向星就构造完了。

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

猜你喜欢

转载自www.cnblogs.com/zdl2234/p/10351139.html