Cod sursa(job #2558393)

Utilizator Iulia25Hosu Iulia Iulia25 Data 26 februarie 2020 15:53:51
Problema Componente tare conexe Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
#include <fstream>

using namespace std;

ifstream fin ("ctc.in");
ofstream fout ("ctc.out");

const int N = 1e5 + 5;

struct nod
{
int et;
nod* adr;
}*L[N],*M[N], *K[N];


int viz[N], v[N], ctc[N];

void citire()
{
int x,y;
while(fin>>x>>y)
{
nod* p=new nod;
p->et=y;
p->adr=L[x];
L[x]=p;
p=new nod;
p->et=x;
p->adr=M[y];
M[y]=p;
}
}

void dfs(int Nod, int k)
{
viz[Nod]=k;
for(nod* a = L[Nod];a!=NULL;a=a->adr)
if(viz[a->et]!=k)
dfs(a->et, k);
}

void df(int Nod, int k)
{
v[Nod]=k;
if (viz[Nod] == k && v[Nod] == k)	 {
	ctc[Nod] = k;
}
for(nod* a=M[Nod];a!=NULL;a=a->adr)	{
	if (v[a->et] != k)
		df(a->et, k);
}
}
int main()	{
  int n,m, k = 0;
  fin >> n >> m;
  citire();
  for(int i=1;i<=n;i++)	{
		if(ctc[i]==0)	 {
			++k;
			dfs(i, k);
			df(i, k);
		}
	}
	fout << k << '\n';
	for(int i=1;i<=n;i++)	{
    nod *p=new nod;
    p->et=i;
    p->adr=K[ctc[i]];
    K[ctc[i]]=p;
	}
  for (int i = 1; i <= k; ++i)	{
    for(nod* a=K[i];a!=NULL;a=a->adr)
    fout<<a->et<<" ";
    fout << endl;
  }
  return 0;
}