Cod sursa(job #2198036)

Utilizator BogdanAlexandruBogdan-Alexandru Dig BogdanAlexandru Data 23 aprilie 2018 13:51:56
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <stdio.h>
#include <iostream>
#include <vector>
#include <deque>
#include <cstring>
#include <queue>
using namespace std;
FILE *f,*g;
vector <int> ctc[100010];
deque <int> coada;
int fr[100010];
int start1[200010],start2[200010];
int t1[2][200010],t2[2][200010];
int nn,sol=0;
void DFS(int nod)
{
    int i=start1[nod];
    fr[nod]=1;
    while(i)
    {
        if(!fr[t1[0][i]])
        {
            fr[t1[0][i]]=1;
            DFS(t1[0][i]);
        }
        else
            i=t1[1][i];
    }
    coada.push_back(nod);
}
void DFST (int nod)
{
    int i=start2[nod];
    fr[nod]=1;
    while(i)
        if(!fr[t2[0][i]])
        {
            fr[t2[0][i]]=1;
            DFST(t2[0][i]);
        }
        else
            i=t2[1][i];
    ctc[sol].push_back(nod);
}
void Afisare(int n)
{
    int i,j;
    int k;
    for(i=1,k=ctc[1].size();i<=n;i++,k=ctc[i].size(),fprintf(g,"\n"))
    {
        for(j=0;j<k;j++)
            fprintf(g,"%d ",ctc[i][j]);
    }
}
int main()
{
    f=fopen("ctc.in","r");g=fopen("ctc.out","w");
    int n,m,i,nr=0,x,y;
    fscanf(f,"%d %d",&n,&m);
    memset(fr,0,sizeof(fr));
    for(i=1;i<=m;i++)
    {
        fscanf(f,"%d %d",&x,&y);
        t1[0][i]=y;
        t1[1][i]=start1[x];
        start1[x]=i;
        t2[0][i]=x;
        t2[1][i]=start2[y];
        start2[y]=i;
    }
    for(i=1;i<=n;i++)
        if(!fr[i])
            DFS(i);
    memset(fr,0,sizeof(fr));
    int nod;
    while(!coada.empty())
    {
        nn=nod=coada.back();
        if(!fr[nod])
        {
            ++sol;
            DFST(nod);
        }
        coada.pop_back();
    }
    fprintf(g,"%d\n",sol);
    Afisare(sol);
    fclose(f),fclose(g);
    return 0;
}