Pagini recente » Cod sursa (job #2277205) | Cod sursa (job #234150) | Cod sursa (job #1996695) | Cod sursa (job #2237337) | Cod sursa (job #2425076)
#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;
}