Cod sursa(job #2429502)

Utilizator patrickdanDan patrick patrickdan Data 9 iunie 2019 20:28:56
Problema Componente tare conexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>
#include<vector>
using namespace std;
vector <int>G[100001];
vector<int>G2[100001];
vector <int>comp[100001];
vector <int> q;
bool viz[100001];
int viz2[100001];
void visit(int nod)
{
    int i;
    viz[nod]=1;
    for(i=0;i<G[nod].size();i++)
      if(!viz[G[nod][i]])
        visit(G[nod][i]);
    q.push_back(nod);
}
void ass(int nod,int root)
{
    int i;
    viz2[nod]=root;
    comp[root].push_back(nod);
    for(i=0;i<G2[nod].size();i++)
      if(!viz2[G2[nod][i]])
        ass(G2[nod][i],root);
}
int main()
{
    freopen("ctc.in","r",stdin);
    freopen("ctc.out","w",stdout);
    int n,m,i,a,b,cnt=0;
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
    {
    scanf("%d%d",&a,&b);
    G[a].push_back(b);
    G2[b].push_back(a);
    }
    for(i=1;i<=n;i++)
    if(viz[i]==0){
      viz[i]=1;
      visit(i);
    }
    for(i=q.size()-1;i>=0;i--)
    {
        if(viz2[q[i]]==0)
        {
        viz2[q[i]]=q[i];
        cnt++;
        ass(q[i],q[i]);
        }
        q.pop_back();
    }
    printf("%d\n",cnt);
    for(i=1;i<=n;i++)
    {
        for(int j=0;j<comp[i].size();j++)
            printf("%d ",comp[i][j]);
        if(comp[i].size()>=1)
        printf("\n");
    }
    return 0;
}