Cod sursa(job #2368562)

Utilizator eduardvintilaVintila Eduard eduardvintila Data 5 martie 2019 16:35:23
Problema Componente tare conexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.33 kb
//doar de test


#include <iostream>
#include <fstream>
#include <stack>
#include <vector>

using namespace std;

ifstream f("ctc.in");
ofstream g("ctc.out");

vector<int> v[100005];
stack<int> stiva;
const long long INF = 1000000;
int n,m,nrc,idx;
int lowlink[100005],id[100005];
vector< vector<int> > ctc;
//int ad[260][260];

void dfs(int x)
{
    int y,i;
    idx++;
    lowlink[x]=idx;
    id[x]=idx;
    stiva.push(x);
    for (i=0;i<v[x].size();i++)
    {
        y=v[x][i];
        if (id[y]==-1)
            dfs(y);
        lowlink[x]=min(lowlink[x],lowlink[y]);
    }
    if (lowlink[x]==id[x])
    {
        vector<int> comp;
        while (true)
        {
            i=stiva.top();
            stiva.pop();
            id[i]=INF;
            lowlink[i]=INF;
            comp.push_back(i);
            //cout<<i<<" ";

            if (x==i)
                break;
        }
        ctc.push_back(comp);
        nrc++;
    }
}

int main()
{
    int x,y,i,j,k;
    f>>n>>m;
    for (i=1;i<=m;i++)
    {
        f>>x>>y;
        v[x].push_back(y);
        //ad[x][y]=1;
    }
    for (i=1;i<=n;i++)
        id[i]=-1;

    for (i=1;i<=n;i++)
    {
        if (id[i]==-1)
            dfs(i);
    }

    /*
    int ok=0;
    vector< pair<int,int> > sol;

    for (k=1;k<ctc.size();k++)
    {
        ok=0;
        for (i=0;i<ctc[k].size() && ok==0;i++)
        {
            x=ctc[k][i];
            for (j=0;j<ctc[0].size() && ok==0;j++)
            {
                y=ctc[0][j];
                if (ad[x][y]==1 || ad[y][x]==1)
                {
                    if (ad[x][y]==1)
                            sol.push_back(make_pair(y,x));
                    else sol.push_back(make_pair(x,y));

                    ad[x][y]=ad[y][x]=1;
                    ok=1;
                }
            }
        }
        if (ok==0)
        {
            ad[x][y]=ad[y][x]=1;
            sol.push_back(make_pair(x,y));
            sol.push_back(make_pair(y,x));
        }
    }
    g<<sol.size()<<'\n';
    for (i=0;i<sol.size();i++)
    {
        g<<sol[i].first<<" "<<sol[i].second<<'\n';
    }
    */
    g<<nrc<<'\n';
    for (i=0;i<nrc;i++)
    {
        for (j=ctc[i].size()-1;j>=0;j--)
            g<<ctc[i][j]<<" ";
        g<<'\n';
    }
    return 0;
}