Cod sursa(job #2122846)

Utilizator AsttridMocanu Ada Astrid Asttrid Data 5 februarie 2018 16:08:08
Problema Componente tare conexe Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int N=100007;
ifstream in("ctc.in");
ofstream out("ctc.out");

vector<int>L[N],Lt[N],ctc[N];
int n,m,Q[N],nrc,u;
bool viz[N];
void citire(){
in>>n>>m;
int i,x,y;
for(i=1;i<=m;i++){
    in>>x>>y;
    L[x].pb(y);
    Lt[y].pb(x);
}}

void dfs1(int x){
int i,z;
viz[x]=1;
Q[++u]=x;
for(i=0;i<L[x].size();i++)
{z=L[x][i];
if(!viz[z])dfs1(z);
}}


void dfs2(int x){
int i,z;
viz[x]=1;
ctc[nrc].pb(x);
for(i=0;i<Lt[x].size();i++){
    z=Lt[x][i];
    if(!viz[z])dfs2(z);}
}

void afisare(){
int i,j;
out<<nrc<<"\n";
for(i=1;i<=nrc;i++)
    {for(j=0;j<ctc[i].size();j++)
    out<<ctc[i][j]<<" ";
    out<<"\n";
}}


void rez(){
int i,y,p;
for(i=1;i<=n;i++)
if(!viz[i])dfs1(i);
for(i=1;i<=n;i++)viz[i]=0;
p=1;
while(p<=u)
{y=Q[p++];
if(!viz[y]){
    nrc++;
    dfs2(y);}
}}

int main(){
citire();
rez();
afisare();
return 0;}