Pagini recente » Cod sursa (job #1402224) | Cod sursa (job #1183829) | Cod sursa (job #2031748) | Cod sursa (job #1159016) | Cod sursa (job #2425071)
#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;
}