Cod sursa(job #2425076)

Utilizator cristiangeambasuCristian Geambasu cristiangeambasu Data 24 mai 2019 11:03:20
Problema Sortare topologica Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <unordered_set>

std::unordered_set<int> unmarked;
std::vector<int> muchii[50000];
int list[50000];
int viz[50000];
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(size_t i = 0; i < muchii[n].size() && 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;

	for(int i = 0; i < n; i++)
		unmarked.emplace(i);

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

		muchii[x].push_back(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;
}