Supongamos que tengo un conjunto de vértices $V$ y una función $f(V_1, V_2)$ que dados dos vértices devuelve +1 si hay una arista desde $V_1$ a $V_2$ -1 si hay una arista desde $V_2$ a $V_1$ y 0 en caso contrario.
Entonces dejemos que $S_0$ sea el conjunto de vértices sin aristas entrantes, $S_1$ sea el conjunto de vértices con aristas entrantes desde vértices en $S_0$ sólo, $S_2$ sea el conjunto de vértices con aristas entrantes desde vértices en $S_0$ y $S_1$ etc.
Estoy buscando un algoritmo que pueda ordenar el conjunto $V$ para que cada vértice de $S_0$ se coloca antes de cada vértice en $S_1$ y así sucesivamente. Ya sé que está relacionado con la ordenación topológica, pero calcular todo el conjunto de aristas para utilizarlo en cualquiera de los algoritmos que se dan en la Wikipedia llevaría $O(n^2)$ tiempo.
He escrito mi propio algoritmo que utiliza la función $f()$ directamente en lugar de precomputar las aristas, pero también se necesita $O(n^2)$ tiempo. Mi pregunta es: ¿es posible hacer algo mejor que $O(n^2)$ ¿tiempo? Estaría muy agradecido incluso de tener uno con un tiempo de ejecución menor.
--editar
Supongamos que $f()$ está garantizado que produce un grafo acíclico dirigido.