链式前向星(模板)

本文深入探讨了链式前向星图算法的存储结构与实现细节,包括head数组、Next数组和edge数组的功能,以及如何通过链式前向星结构存储有向和无向图。文章通过具体实例展示了算法的运作过程,并提供了完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链式前向星和邻接表一样,只是存储方式变成了数组!

head数组存储最后插入该链表的边的编号,每条边插入都是在该链表的表头插入,然后head前移指向当前新边(即当前编号tot),新节点指向原来的头结点!Next数组相当于邻接表的Next指针,存储指向同起点的另一条边的编号;edge数组存储当前边编号对应的边的终点!

注意

  • next不能使用,会和系统变量冲突,,使用Nextne
  • 无向图需要存储两次,反向正向都是路径
  • 有向图只需要存储一次
  • tot从0和1开始都可以,他只是影响边的编号,我们不在意,边的编号一般是1开始!
// 5 7
// 1 2 1
// 2 3 2
// 3 4 3
// 1 3 4
// 4 1 5
// 1 5 6
// 4 5 7
// 1
// Next[i]:以i为起点的下一条边的终点
// head[i]:以i为起点的最后一条边的编号

// 对于1 2 1这条边:edge[0] = 2;     Next[0] = -1;    head[1] = 0;

// 对于2 3 2这条边:edge[1] = 3;     Next[1] = -1;    head[2] = 1;

// 对于3 4 3这条边:edge[2] = 4;     Next[2] = -1;    head[3] = 2;

// 对于1 3 4这条边:edge[3] = 3;     Next[3] = 0;     head[1] = 3;

// 对于4 1 5这条边:edge[4] = 1;     Next[4] = -1;    head[4] = 4;

// 对于1 5 6这条边:edge[5] = 5;     Next[5] = 3;     head[1] = 5;

// 对于4 5 7这条边:edge[6] = 5;     Next[6] = 4;     head[4] = 6;

// 看i = 1的情况,head[1] = 5, edge[5] = 5      1 -> 5
//                Next[5] = 3, edge[3] = 3      1 -> 3
//                Next[3] = 0, edge[0] = 2      1 -> 2

#include <iostream>
#include <cstring>

using namespace std;

const int N = 1e5 + 10;
int head[N], edge[N], ver[N], Next[N], n, m, k, tot = 0;

void add(int u, int v, int w)
{
    edge[tot] = v;
    ver[tot] = w;
    // 新节点插入到表头
    Next[tot] = head[u];
    // 上面三句为新节点初始化
    // head指向新的边的编号
    head[u] = tot++;
}

int main()
{
	// 节点数和边数
    cin >> n >> m;
    // 初始化head数组为-1
    memset(head, -1, sizeof head);
    for(int i = 0; i < m; i++){
        int u, v, w;
        cin >> u >> v >> w;
        // 无向图
        add(u, v, w), add(v, u, w);
    }
    cin >> k;
    // 遍历第k个节点(k >= 1)终止条件~i,i = Next[i]
    for(int i = head[k]; ~i; i = Next[i]){
        cout << k << " -> " << edge[i] << " 边权为:" << ver[i] << endl; 
    }
    return 0;
}

运行结果:

1 -> 5 边权为:6
1 -> 4 边权为:5
1 -> 3 边权为:4
1 -> 2 边权为:1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值