---
id: toposort
title: "Topological Sort"
author: Benjamin Qi, Michael Cao
prerequisites: 
 - Gold - Breadth First Search
 - Gold - Introduction to Dynamic Programming
description: "?"
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-list 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)

### 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)

## 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-list 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?)
</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-list problems={metadata.problems.general} />