链式前向星存图

对于图可以用邻接矩阵或邻接表,当边很少时邻接矩阵很浪费空间,而邻接表可以用vector来实现,在做题时有一种链式前向星存图,其实现原理其实和邻接表很类似:

struct Node 
{
    int to; //这条边所指向的点
    int w; //这条边的权值
    int next; //下一条边的编号
}e[MAXN];

另外还要定义一个head[ ]数组,head[a] 表示以第a个结点为起点的第一条边的编号

将一条边存储在数组中的函数为:

void add(int x,int y,int z) //表示将一条从x指向y的权值为z的有向边添加到链表之中
{
    cnt++;     //cnt为边的编号
    e[cnt].to=y;  //将新边的to赋值成为y,表示这条边指向y
    e[cnt].w=z;   //将新边的w赋值成为z,表示这条边的值为z
    e[cnt].next=head[x];  //将新边的next指向原来head[a]指向的边的编号
    head[x]=cnt;  //让head[x]指向当前边的编号,表示这条边是以x为起始节点
}

遍历以P为起始点的所有边:

for(int i=head[p]; i!=0; i=e[i].next)
{
    printf("%d %d %d", p, e[i].to, e[i].w);
}

我们可以通过head数组找到以p为开头的第一条边,并用next一直找下去,因为head数组最开始为0,所以当i等于0时,就是结束。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值