图-有向带权图的十字邻接表的数组实现

博客介绍了用数组实现十字邻接表解决有向带权图问题(含重边、自环),理论上也能解决无向图问题。阐述了输入格式,解读了方法,说明了以边号为操作对象、反序入表、放弃数组[0]位置等特点,还给出了基本操作的实现。

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

有向图需要用十字邻接表来表示。但用链表实现十字邻接表是非常苦恼的,代码很容易便会达到数百行。事实上有一种数组实现十字邻接表,不用指针便可解决有向带权图的问题(含重边,自环)。 理论上有向图解决了,无向图也可以被解决。

输入格式

4 5
1 4 9
4 3 8
1 2 5
2 4 6
1 3 7

输入时点也可以是点的名称,此时需要建立点的名称字符串与点号的映射表。
图
数据结构
数组实现

方法解读

i 号点的第一条边边号为 first[i];
i 号边的出点的下一条边边号为 next[i];

特点

以边号为主要操作对象。 寻找边的方法是在表中先得到边号,再用u、v、w数组由边号得到边的信息。
反序入表。 各个边在表中的排列顺序与读入顺序恰相反,这是因为每次插入新边都是在链头而非链尾插入。
放弃数组[0]位置。 为了建立起边号、点号与索引的直接对应关系,建议直接从[1]开始使用。
注:
点号指的是读入时代表点的数字(从多少开始计由输入决定,甚至无需连续。但超大数组大小需能保证容纳所有点号,也可先把点号视作字符串名称记录再建立点号与字符串名称的映射表);
边号指的是读入时该边是第几个读入的边(从1开始计)。

基本操作实现

0. InitialGraph
//全局变量  ps:我也不想这么野蛮 我也是被带坏的
int u[5000005], v[5000005], w[5000005];	//边的信息
int first[5000005], next[5000005];		//threads
bool flag[5000005];						//边是否被访问


//图的初始化:
    for (i = 1; i <= M; i++) {
        first[i] = -1;
        flag[i] = false;
    }
1. BuildGraph

有向图:

    for (i = 1; i <= N; i++) {			// i = 1 开始 弃置数组[0]位置
        scanf("%d %d %d", &u[i], &v[i], &w[i]);
        
        next[i] = first[u[i]];
        first[u[i]] = i;  
    }

无向图:

    for (i = 1; i <= N; i++) {			// i = 1 开始 弃置数组[0]位置
        scanf("%d %d %d",&u[i],&v[i],&w[i]);
        
        next[i] = first[u[i]];
        first[u[i]] = i;
        
		//对 i + N 做一遍刚才所做的事  且u v互换(反向)  (N是边数)
        v[i + N] = u[i]; u[i + N] = v[i]; w[i + N] = w[i];
        next[i + N] = first[u[i + N]];
        first[u[i + N]] = i + N;
    }
2. 遍历 i 号点的所有边

有向图:

	k = first[i];		// k 初始化为第一条边边号
    while (k != -1) {
		...
		...
        k = next[k];	// k 更新为下一条边边号
    }
3.遍历全图所有边(对所有点,遍历点的所有边)
for (i = 1; i <= n; i++) {				// i = 1 开始 弃置数组[0]位置
    k = first[i];
    while (k != -1)
    {
		...
		...
        k = next[k];
    }
}

(图源https://www.cnblogs.com/codingmengmeng/p/5645073.html)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值