Cod sursa(job #2153629)

Utilizator geo_furduifurdui geo geo_furdui Data 6 martie 2018 13:03:19
Problema Componente tare conexe Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
#include<vector>
using namespace std;
ifstream cin ("ctc.in");
ofstream cout ("ctc.out");
vector <int> g[100010],sol[100010];
int n,m,high[100010],level[100010],ctc[100010];
void read ()
{   int x,y;
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>x>>y;
        g[x].push_back(y);
    }
}
void dfs (int nod)
{   high[nod]=level[nod]; ctc[nod]=nod;
    for(int i=0;i<g[nod].size();i++)
    {
        int fiu=g[nod][i];
        if(high[nod]>high[fiu] && level[fiu]!=0) high[nod]=high[fiu],ctc[nod]=ctc[fiu];
    }
    for(int i=0;i<g[nod].size();i++)
    {
        int fiu=g[nod][i];
        if(level[fiu]==0)
        {
            level[fiu]=level[nod]+1;
            dfs(fiu);
            if(high[fiu]<high[nod]) high[nod]=high[fiu],ctc[nod]=ctc[fiu];
        }
    }
}
void solve ()
{ int nr=0;
    for(int i=1;i<=n;i++)
    {
        int nod=ctc[i]; while(ctc[nod]!=nod) nod=ctc[nod];
        if(level[nod]!=-1) level[nod]=-1,nr++;
        sol[nod].push_back(i);
    }
    cout<<nr<<"\n";
    for(int i=1;i<=n;i++)
    { int u=0;
        for(int j=0;j<sol[i].size();j++)
            cout<<sol[i][j]<<" ",u=1;
        if(u==1) cout<<"\n";
    }
}
int main()
{
    read();
    for(int i=1;i<=n;i++)
        if(level[i]==0) level[i]=1,dfs(i);
    solve();
    cin.close();
    cout.close();
    return 0;
}