数据结构期末抱佛脚,发现没学过关键路径,补上~
拓扑排序
- 有向无环图,顶点线性排序使得对于每一个有向边,起始节点都在尾节点的前面
- 前提:DAG
- 需要记录一个点的入度,对于每个点,删去所有出边并更新到达节点的入度,每次加入入度为0的点,复杂度O(E+V)O(E+V)O(E+V)
- 应用:找环;找最长路;找优先级最大(等效于最长路);
- 字典序拓扑排序:上述队列改成优先队列,复杂度O(E+VlogV)O(E+V\log V)O(E+VlogV)
void toposort()
{
while (!topo.empty())
{
int cur = topo.front();
topo.pop();
for (int i = 1; i <= n; i++)
{
if (graph[cur][i])
{
in[i]--;
{
// 进行操作
}
if (!in[i])
topo.push(i);
}
}
}
}
应用:关键路径
- 定义:顶点表活动,有向边表优先级,这样的DAG称AOV(activity on vertex network);边有权值表时间,称AOE网(activity on edge);AOE网上的最长路径称关键路径,只有这条路径上的关键活动进行时间变化能够影响到整体时间。
- uuu 节点的最早开始时间ve[u]ve[u]ve[u] ,最晚开始时间vl[u]vl[u]vl[u] 。
- 以最早开始时间为例,对于边(u,v,w)(u,v,w)(u,v,w) ,更新操作:ve[v]=max(ve[v],ve[u]+w)ve[v]=max(ve[v],ve[u]+w)ve[v]=max(ve[v],ve[u]+w) 。
- 正反图分别进行拓扑排序,过程中进行ve,vlve,vlve,vl 的更新,ve[u]=vl[u]ve[u]=vl[u]ve[u]=vl[u] 的点即为关键路径上的点。
本文介绍了数据结构中的拓扑排序及其应用,包括找环、找最长路和优先级最大问题。还详细讲解了关键路径的概念,如何在AOV和AOE网中寻找关键路径,并通过正反图进行拓扑排序更新最早和最晚开始时间。拓扑排序和关键路径在项目管理和工程优化中有重要应用。
1710

被折叠的 条评论
为什么被折叠?



