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、邻接表和链表区别
邻接表是图的专属结构,本质是“多链表”,用于高效存储稀疏图。单链表是通用线性结构,侧重动态数据操作。