This repository has been archived on 2022-06-22. You can view files and clone it, but cannot push or open issues or pull requests.
usaco-guide/content/4_Gold/TopoSort.mdx
2020-07-17 18:29:45 -07:00

99 lines
4 KiB
Text

---
id: toposort
title: "Topological Sort"
author: Benjamin Qi, Michael Cao
prerequisites:
- Gold - Breadth First Search
- Gold - Introduction to Dynamic Programming
description: "An ordering of vertices in a directed acyclic graph that ensures that a node is visited before a node it has a directed edge to."
frequency: 1
---
import { Problem } from "../models";
export const metadata = {
problems: {
sample: [
new Problem("CSES", "Course Schedule", "1679", "Easy", false, []),
],
dp: [
new Problem("CSES", "Longest Flight Route", "1680", "Easy", false, []),
],
general: [
new Problem("CSES", "Game Routes", "1681", "Easy", false, [], "counting paths on DAG"),
new Problem("Kattis", "Quantum", "https://open.kattis.com/contests/acpc17open/problems/quantumsuperposition", "Easy", false, [], "enumerating paths on DAG"),
new Problem("Gold", "Timeline", "1017", "Easy", false, [], "not explicitly given, but graph is a DAG"),
new Problem("Gold", "Milking Order", "838", "Normal", false, ["TopoSort", "Binary Search"]),
new Problem("CSES", "Course Schedule II", "1681", "Hard", false, [], "equivalent to [Minimal Labels](https://codeforces.com/contest/825/problem/E)"),
],
}
};
To review, a **directed** graph consists of edges that can only be traversed in one direction. Additionally, a **acyclic** graph defines a graph which does not contain cycles, meaning you are unable to traverse across one or more edges and return to the node you started on. Putting these definitions together, a **directed acyclic** graph, sometimes abbreviated as DAG, is a graph which has edges which can only be traversed in one direction and does not contain cycles.
## Topological Sort
<Problems problems={metadata.problems.sample} />
A [topological sort](https://en.wikipedia.org/wiki/Topological_sorting) of a directed acyclic graph is a linear ordering of its vertices such that for every directed edge $u\to v$ from vertex $u$ to vertex $v$, $u$ comes before $v$ in the ordering.
## Tutorial
<Resources>
<Resource source="CSA" title="Topological Sorting" url="topological_sorting" starred>both BFS, DFS</Resource>
</Resources>
### DFS
<Resources>
<Resource source="CPH" title="16.1, 16.2 - Topological Sorting">DFS</Resource>
<Resource source="cp-algo" title="Topological Sort" url="graph/topological-sort.html">DFS</Resource>
</Resources>
(implementation)
<IncompleteSection />
### BFS
The BFS version, known as [Kahn's Algorithm](https://en.wikipedia.org/wiki/Topological_sorting#Kahn's_algorithm), makes it obvious how to extract the lexicographically minimum topological sort.
(implementation)
<IncompleteSection />
## Dynamic Programming
<Resources>
<Resource source="PAPS" title="9.1">Best Path in a DAG</Resource>
</Resources>
One useful property of directed acyclic graphs is, as the name suggests, that no cycles exist. If we consider each node in the graph as a state, we can perform dynamic programming on the graph if we process the states in an order that guarantees for every edge $u\to v$ that $u$ is processed before $v$. Fortunately, this is the exact definition of a topological sort!
<Problems problems={metadata.problems.dp} />
In this task, we must find the longest path in a DAG.
<Spoiler title="Solution">
Let $dp[v]$ denote the length of the longest path ending at the node $v$. Clearly
$$
dp[v]=\max_{\text{edge } u\to v \text{ exists}}dp[u]+1,
$$
or zero if $v$ has in-degree $0$. If we process the states in topological order, it is guarangeed that $dp[u]$ will already have been computed before computing $dp[v]$.
(implementation?)
<IncompleteSection />
</Spoiler>
<!-- However, not all problems clearly give you directed acyclic graphs (ex. [Plat - Cave Paintings](http://usaco.org/index.php?page=viewproblem2&cpid=996)). An important step in many problems is to reduce the statement into a directed acyclic graph. See the editorial of the linked problem for more information.
(Ben - this last paragraph doesn't seem very helpful.) -->
## Problems
<Problems problems={metadata.problems.general} />