Pagini recente » Cod sursa (job #2470636) | Cod sursa (job #876899) | Cod sursa (job #1943056) | Cod sursa (job #1278845) | Cod sursa (job #1906757)
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
struct Graf { int index, lowLink; bool inStack; vector<int> v; };
int n, index;
Graf node[100002];
stack<int> myStack;
void GoVisit(int nod)
{
node[nod].index = ++index;
node[nod].lowLink = index;
myStack.push(nod);
node[nod].inStack = true;
for (int i = 0; i < node[nod].v.size(); i++)
{
if (!node[node[nod].v[i]].index)
{
GoVisit(node[nod].v[i]);
node[nod].lowLink = min(node[nod].lowLink, node[node[nod].v[i]].lowLink);
}
else if(node[node[nod].v[i]].inStack)
node[nod].lowLink = min(node[nod].lowLink, node[node[nod].v[i]].index);
}
if (node[nod].index == node[nod].lowLink)
{
while (myStack.top() != nod)
{
fout << myStack.top() << ' ';
node[myStack.top()].inStack = false;
myStack.pop();
}
fout << myStack.top() << ' ';
myStack.pop();
fout << '\n';
}
}
int main()
{
int m, n1, n2;
fin >> n >> m;
for (int i = 1; i <= m; i++)
{
fin >> n1 >> n2;
node[n1].v.push_back(n2);
}
for (int i = 1; i <= n; i++)
if (!node[i].index)
GoVisit(i);
return 0;
}