Cod sursa(job #846483)

Utilizator test_13testing test_13 Data 2 ianuarie 2013 12:19:38
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <cstring>
#include <vector>
#include <deque>
using namespace std;
#define Max 100001

vector<int>g[Max],t[Max],c;
vector<vector<int> >d;
bool viz[Max],gviz[Max],tviz[Max];
int n;

void dfs(int x,vector<int>g[],bool iviz[])
{
	int y;
	iviz[x]=1;
	for(int i=0;i<g[x].size();i++)
	{
		y=g[x][i];
		if(!viz[y] && !iviz[y])dfs(y,g,viz);
	}
}

void ctc()
{
	int nr=0;
	for(int i=1;i<=n;i++)
		if(!viz[i])
		{
			memset(gviz,0,sizeof(gviz));
			memset(tviz,0,sizeof(tviz));
			dfs(i,g,gviz);
			dfs(i,t,tviz);
			nr++;
			for(int i=1;i<=n;i++)
				if(gviz[i] && tviz[i])
				{
					viz[i]=1;
					c.push_back(i);
				}
			d.push_back(c);
			c.resize(0);
		}
	printf("%d\n",nr);
	for(int i=0;i<d.size();i++)
	{
		for(int j=0;j<d[i].size();j++)printf("%d ",d[i][j]);
		printf("\n");
	}
}

int main()
{
	int m,x,y;
	freopen("ctc.in","r",stdin);
	freopen("ctc.out","w",stdout);
		scanf("%d %d",&n,&m);
		for(int i=1;i<=m;i++)
		{
			scanf("%d %d",&x,&y);
			g[x].push_back(y);
			t[y].push_back(x);
		}
		ctc();
	return 0;
}