#include <stdio.h>
#include <stdlib.h>
#include <math.h>
const float C = 2.0; // Multiplicativ constant for dynamic list of adj
const char TRUE = 1;
const char FALSE = 0;
void read(char *file, int *N, int ***adj);
void DFS(int s, int **adj, char *vis, int *nodes, int *p);
void topsort(int N, int **adj, int **nodes);
void write(char *file, int N, int **adj, int *nodes);
int main()
{
int N, **adj, *nodes;
read("sortaret.in", &N, &adj);
topsort(N, adj, &nodes);
write("sortaret.out", N, adj, nodes);
return 0;
}
void read(char *file, int *N, int ***adj)
{
FILE *fin;
int i, j;
fin = fopen(file, "r");
fscanf(fin, "%d%*d", N); // We don't need M
*adj = malloc((*N + 1) * sizeof(int *));
for (i = 1; i <= *N; i++) {
(*adj)[i] = malloc(2 * sizeof(int));
(*adj)[i][0] = 2; // size
(*adj)[i][1] = 2; // capacity
}
while (fscanf(fin, "%d%d", &i, &j) == 2) {
if ((*adj)[i][0] == (*adj)[i][1]) {
(*adj)[i] = realloc((*adj)[i], ceil(C * (*adj)[i][1]) * sizeof(int));
(*adj)[i][1] = ceil(C * (*adj)[i][1]);
}
(*adj)[i][(*adj)[i][0]] = j;
(*adj)[i][0]++;
}
fclose(fin);
}
void DFS(int s, int **adj, char *vis, int *nodes, int *p)
{
int i;
for (i = 2; i < adj[s][0]; i++) {
if (!vis[adj[s][i]]) {
vis[adj[s][i]] = TRUE;
DFS(adj[s][i], adj, vis, nodes, p);
}
}
nodes[*p] = s;
(*p)--;
}
void topsort(int N, int **adj, int **nodes)
{
char *vis;
int i, p;
*nodes = malloc((N + 1) * sizeof(int));
vis = malloc((N + 1) * sizeof(char));
for (i = 1; i <= N; i++) {
vis[i] = FALSE;
}
p = N; // position in the nodes array
for (i = 1; i <= N; i++) {
if (!vis[i]) {
vis[i] = TRUE;
DFS(i, adj, vis, *nodes, &p);
}
}
free(vis);
}
void write(char *file, int N, int **adj, int *nodes)
{
FILE *fout;
int i;
fout = fopen(file, "w");
for (i = 1; i <= N; i++) {
fprintf(fout, "%d ", nodes[i]);
}
fclose(fout);
for (i = 1; i <= N; i++) {
free(adj[i]);
}
free(adj);
free(nodes);
}