Cod sursa(job #2425071)

Utilizator cristiangeambasuCristian Geambasu cristiangeambasu Data 24 mai 2019 10:51:33
Problema Sortare topologica Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <iostream>
#include <fstream>
#include <unordered_set>

std::unordered_set<int> unmarked;
int list[50000];
int viz[50000];
int** muchii;
int list_size = 0;
bool is_dag = true;

void visit(int n)
{
	if(viz[n] == 2) return;
	if(viz[n] == 1) { is_dag = false; return; }

	viz[n] = 1;
	for(int i = 1; i <= muchii[n][0] && is_dag; i++)
		visit(muchii[n][i]);

	viz[n] = 2;
	list[list_size++] = n;
	unmarked.erase(unmarked.find(n));
}

int main()
{
	std::ifstream fin("sortaret.in");
	std::ofstream fout("sortaret.out");
	if(!fin.is_open() || !fout.is_open())
		return -1;

	int n, m, x, y;
	fin >> n >> m;

	muchii = new int* [n];
	for(int i = 0; i < n; i++)
	{
		muchii[i] = new int[n + 1]{ 0 };
		unmarked.emplace(i);
	}

	for(int i = 0; i < m; i++)
	{
		fin >> x >> y;
		x--; y--;

		muchii[x][++muchii[x][0]] = y;
	}

	while(!unmarked.empty() && is_dag)
		visit(*unmarked.begin());

	if(is_dag)
	{
		for(int i = list_size - 1; i >= 0; i--)
			fout << list[i] + 1 << ' ';
	}
	else
	{
		fout << "NOT DAG!";
	}

	return 0;
}