拓扑排序 学习笔记
分析题目
求一个图的拓扑序。需要用到拓扑排序。
拓扑排序
将一张图中的顶点以线性方式进行排序,使得对于任何的顶点
并且拓扑排序只能在有向无环图(DAG)中完成。
做法:每次找到入度为
删去之后再找到入度为
代码
BFS
考虑建图时开一个数组
然后进行拓扑排序:
定义一个队列
首先遍历
每次取出
重复操作,直到队列为空(整个过程相当于BFS)。
代码实现:
#include <bits/stdc++.h>
#define int long long
const int N = 1005;
using namespace std;
inline int read(){
int r = 0,w = 1;
char c = getchar();
while (c < '0' || c > '9'){
if (c == '-'){
w = -1;
}
c = getchar();
}
while (c >= '0' && c <= '9'){
r = (r << 3) + (r << 1) + (c ^ 48);
c = getchar();
}
return r * w;
}
struct edge{
int nxt,to;
}e[N];
int cnt = 0,head[N];
void edge_add(int x,int y){
cnt++;
e[cnt].nxt = head[x];
head[x] = cnt;
e[cnt].to = y;
}
int n,ind[N];
void topo(){
queue<int>q;
for (int i = 1;i <= n;i++){
if (!ind[i]){
q.push(i);
printf("%lld ",i);
}
}
while (!q.empty()){
int tmp = q.front();
q.pop();
for (int i = head[tmp];i;i = e[i].nxt){
int v = e[i].to;
ind[v]--;
if (!ind[v]){
q.push(v);
printf("%lld ",v);
}
}
}
}
signed main(){
n = read();
for (int i = 1;i <= n;i++){
int x = read();
while (x){
edge_add(i,x);
ind[x]++;
x = read();
}
}
topo();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下