Cod sursa(job #2277831)

Utilizator triscacezarTrisca Vicol Cezar triscacezar Data 6 noiembrie 2018 21:32:21
Problema Componente tare conexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <bits/stdc++.h>

using namespace std;

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

int n,m,k,i,j,x,y,ok[2],niv[100010],up[100010],gr[100010];
stack<int> St;
vector<vector<int> > C;
vector<int> OK[2],v[100010];
bitset<100010> viz,in,coming,going;

void dfs(int nod)
{
    viz[nod]=1;
    St.push(nod);
    in[nod]=1;
    for(auto it:v[nod])
        if(!viz[it])
        {
            up[it]=niv[it]=++k;
            dfs(it);
            up[nod]=min(up[nod],up[it]);
        }
        else
            if(in[it])
                up[nod]=min(up[nod],niv[it]);
    if(up[nod]==niv[nod])
    {
        vector<int> c;
        while(St.top()!=nod)
        {
            in[St.top()]=0;
            c.push_back(St.top());
            St.pop();
        }
        in[nod]=0;
        c.push_back(nod);
        St.pop();
        C.push_back(c);
    }
}

int main()
{
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>x>>y;
        v[x].push_back(y);
    }
    for(i=1;i<=n;i++)
        if(!viz[i])
        {
            niv[i]=up[i]=++k;
            dfs(i);
        }
    g<<C.size()<<'\n';
    for(auto it:C)
    {
        for(auto that:it)
            g<<that<<' ';
        g<<'\n';
    }
//    for(i=0;i<C.size();i++)
//        for(auto it:C[i])
//            gr[it]=i;
//    for(i=0;i<C.size();i++)
//    {
//        for(auto it:C[i])
//            for(auto that:v[it])
//            if(gr[that]!=i)
//            {
//                coming[gr[that]]=1;
//                going[i]=1;
//            }
//    }
//    for(i=0;i<C.size();i++)
//        if(!(coming[i]&&going[i]))
//            ok[coming[i]]++,OK[coming[i]].push_back(C[i][0]);
//    g<<max(ok[0],ok[1])<<'\n';
    return 0;
}