C++数据结构11:拓扑结构

1、概念

拓扑数据结构通常指用于表示或分析拓扑关系(如邻接、连通性、层次性)的数据结构,常见于图论拓扑排序。其核心是描述元素之间的相对关系而非绝对位置。

2、实战例子 

给定n个点,m条边的有向图,判断是否存在拓扑序列。

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
int val[N], h[N], ne[N], idx;  // 邻接表:val存终点,ne存下一条边索引,h存头指针
int rudu[N];                   // 存储每个点的入度
int n, m;                      // 点数、边数
int qu[N], tt = -1, hh = 0;    // 队列:存储入度为0的点

void add(int a, int b) {       // 添加边a→b
    val[idx] = b;
    ne[idx] = h[a];
    h[a] = idx++;
}

void tuopu_sort() {
    for (int i = 1; i <= n; i++)  // 初始入度为0的点入队
        if (rudu[i] == 0) qu[++tt] = i;

    while (tt >= hh) {            // 队列非空时处理
        int x = qu[hh++];         // 取出队头
        for (int i = h[x]; i != -1; i = ne[i]) {  // 遍历x的所有邻边
            int y = val[i];       // 终点y
            if (--rudu[y] == 0)   // 入度减1,若为0则入队
                qu[++tt] = y;
        }
    }
    if (tt == n - 1)              // 所有点入队,说明无环
        for (int i = 0; i < n; i++) cout << qu[i] << ' ';
    else cout << -1;              // 否则有环
}
int main() {
    cin >> n >> m;
    memset(h, -1, sizeof h);      // 初始化邻接表头指针;毕业操作
    while (m--) {
        int x, y;
        cin >> x >> y;
        rudu[y]++;                // y的入度+1
        add(x, y);                // 添加边x→y
    }
    tuopu_sort();
    return 0;
}

3、邻接表和链表区别

 邻接表是图的专属结构,本质是“多链表”,用于高效存储稀疏图。单链表是通用线性结构,侧重动态数据操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值