Cod sursa(job #1949612)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 2 aprilie 2017 11:55:35
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <cstdio>
#include <stack>
#include <vector>

using namespace std;

const int N = 100005;

int n, m;

vector<int> vecini[N];
vector<int> vecinix[N];

int viz[N];
int vizx[N];

stack<int> S;
vector<int> sol;
vector<vector<int> > solx;

void citire()
{
	scanf("%d %d", &n, &m);

	int tmp1, tmp2;

	for(int i = 0; i < m; i++)
	{
		scanf("%d %d", &tmp1, &tmp2);

		tmp1--;
		tmp2--;

		vecini[tmp1].push_back(tmp2);
		vecinix[tmp2].push_back(tmp1);
	}
}

void dfs(int x)
{
	viz[x] = true;
	
	int l = vecini[x].size();

	for(int i = 0; i < l; i++)
	{
		if(viz[vecini[x][i]] == false)
		{
			dfs(vecini[x][i]);
		}
	}

	S.push(x);
}

void dfsx(int x)
{
	vizx[x] = true;

	int l = vecinix[x].size();

	for(int i = 0; i < l; i++)
	{
		if(vizx[vecinix[x][i]] == false)
		{
			dfsx(vecinix[x][i]);
		}
	}

	sol.push_back(x);
}

void solve()
{
	for(int i = 0; i < n; i++)
	{
		if(viz[i] == false)
		{
			dfs(i);
		}
	}

	while(S.empty() == false)
	{
		int x = S.top();
		S.pop();

		if(vizx[x] == false)
		{
			sol.clear();
			dfsx(x);
			solx.push_back(sol);
		}
	}
}

void afisare()
{
	printf("%d\n", solx.size());

	int l = solx.size();;

	for(int i = 0; i < l; i++)
	{
		int ll = solx[i].size();

		for(int j = 0; j < ll; j++)
		{
			printf("%d ", solx[i][j] + 1);
		}

		printf("\n");
	}
}

int main()
{
	freopen("ctc.in", "r", stdin);
	freopen("ctc.out", "w", stdout);

	citire();
	solve();
	afisare();

	return 0;
}