拓扑排序与动态规划

拓扑排序与动态规划

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代码:
请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值