拓扑排序与动态规划
1.知识点
如果一个有向图无法从某个顶点出发经过若干条边回到该点,则这个图是一个有向无环图 (DAG图)。
拓扑排序指是将一个DAG图中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E( g ),则u在线性序列中出现在v之前。
实现过程:
bfs:
首先将入度为0的顶点入队;
while(队列不空){
队头的所有邻接点入度-1;
如果存在邻接点入度变为0时则入队;
出队;
}
出队序列就是拓扑序列;
in[N]:每个点的入度
priority_queue<int ,vecto<int>,greater<int> > q;
vector<int> a[N];链式前向星记录边
for(i:遍历所有的点){
if(in[i]==0){
q.push(i);
}
}
while(!q.empty()){
int x=q.top();
ans.push(x);
q.pop();
for(auto i:a[x]){
in[i]--;
if(in[i]==0) q.push(i);
}
}
dfs:
不用管数据范围,直接搜,不要畏惧爆栈!!!
爆栈是电脑的本能,勇气是人类的赞歌!
深搜通往天堂,动规通往地狱 —— 塞内加
“深搜是抵抗爆栈、掌握爆栈,而不是没有爆栈。” —— 哈里·杜鲁门
深搜是面对动规的困难时,依然保持微笑和坚定的算法
当你往前走的时候,要一路撒下花朵,因为同样的道路你决不会再走第二回。——深度优先搜索
2.例题
AC答案:
拓扑排序与动态规划
例题
这题用到了一点dp
f
[
i
]
=
∑
k
=
1
n
f
[
k
]
f[i]=\sum_{k=1}^n f[k]
f[i]=∑k=1nf[k]
AC代码: