Cod sursa(job #1906757)

Utilizator horiainfoTurcuman Horia horiainfo Data 6 martie 2017 16:13:07
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#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;
}