【数据结构与算法】拓扑排序,关键活动,关键路径 详解

拓扑排序算法

bool topologicalSort() {
	stack<int> stk;
	int id[N];
	int cnt = 0;
	for (int i = 1; i <= n; i++) {
		if (!inDeg[i]) {
			stk.push(i);
		}
		id[i] = inDeg[i];
	}
	while (stk.size()) {
		int t = stk.top();
		stk.pop();
		cout << t << " ";
		cnt++;
		for (auto i : g[t]) {
			id[i]--;
			if (!id[i]) {
				stk.push(i);
			}
		}
	}
	cout << endl;
	return cnt == n;
}

举例简述"拓扑排序"所解决的实际问题。

拓扑排序在很多实际问题中都有应用,其中一个常见的例子是任务调度问题。

假设有一系列的任务需要完成,而这些任务之间存在一定的依赖关系,即某些任务必须在其他任务完成后才能开始。你的目标是找到一种完成任务的顺序,使得每个任务在其依赖的任务完成后才开始。

任务可以看作是图的节点,任务之间的依赖关系可以看作是有向边。拓扑排序就是找到一种节点的排列顺序,使得每个节点(任务)都在其有向边指向的节点(依赖的任务)之后。

通过拓扑排序,可以得到一个满足所有依赖关系的任务完成顺序。如果无法找到这样的顺序,那么说明任务之间的依赖关系存在环,也就是说存在无法完成的任务。

请图示”拓扑排序”的过程。


什么是关键活动?

l(j)=e(j)的活动(活动的最迟开始时间 = 活动的最早开始时间),即关键路径上的所有活动。

什么是关键路径?

从源点到收点的最长的一条路径,或者全部由关键活动构成的路径。

举例简述"关键路径"所解决的实际问题。

可用于估算工程项目完成时间。

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
拓扑排序是一种对有向无环图进行排序的算法,它将图中的节点按照它们的依赖关系进行排序,使得每个节点在排列中都在它的后继节点之前。拓扑排序可以用于解决很多问题,例如任务调度、编译顺序等。 关键路径算法是一种用于确定项目中关键任务的算法。它通过计算每个任务的最早开始时间和最晚开始时间,来确定哪些任务对项目的完成时间具有关键作用。关键路径算法可以帮助项目管理者确定项目的关键路径,从而更好地控制项目的进度。 以下是拓扑排序关键路径算法的详细步骤: 1. 拓扑排序: - 创建一个空列表result和一个空集合visited。 - 遍历图中的每个节点,对于每个未访问过的节点,调用dfs函数进行深度优先遍历。 - 在dfs函数中,对于当前节点,将其加入visited集合中,并遍历其所有的后继节点。 - 对于每个后继节点,如果它未被访问过,则递归调用dfs函数。 - 在递归返回时,将当前节点加入result列表中。 - 最后将result列表反转,即可得到拓扑排序的结果。 2. 关键路径算法: - 对于每个任务,计算它的最早开始时间EST和最晚开始时间LST。 - 对于每个任务,计算它的最早完成时间EFT和最晚完成时间LFT。 - 对于每个任务,计算它的总浮动时间TF和自由浮动时间FF。 - 对于每个任务,如果它的TF为0,则它是关键任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值