Cod sursa(job #3243170)

Utilizator alexdmnDamian Alexandru alexdmn Data 16 septembrie 2024 10:07:27
Problema Componente tare conexe Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#include <queue>
#include <stack>

using namespace std;
stack <int> s, r[100005];
vector <int> v[100005];
int cnt, f[100005], l[100005], p[100005], cu=1;
void dfs(int i)
{
    f[i]=cu;
    cu++;
    l[i]=f[i];
    s.push(i);
    p[i]=1;
    for(auto ed : v[i])
    {
        if(f[ed]==0)
        {
            dfs(ed);
            l[i]=min(l[ed], l[i]);
        }
        else if(p[ed]==1)
        {
            l[i]=min(f[ed], l[i]);
        }
    }
    cout<<l[i]<<"! ";
    if(l[i]==f[i])
    {
        cnt++;
        while(s.top()!=i)
        {
            r[cnt].push(s.top());
            p[s.top()]=0;
            s.pop();
        }
        r[cnt].push(s.top());
        p[s.top()]=0;
        s.pop();
    }
}
int main()
{
    ifstream cin("ctc.in");
    ofstream cout("ctc.out");

    int n, m, a, b;
    cin>>n>>m;

    for(int i=0;i<m;i++)
    {
        cin>>a>>b;
        v[a].push_back(b);
    }

    for(int i=1;i<=n;i++)
    {
        if(f[i]==0)
        {
            dfs(i);
        }
    }

    cout<<cnt<<'\n';
    for(int i=1;i<=cnt;i++)
    {
        while(r[i].size()>0)
        {
            cout<<r[i].top()<<" ";
            r[i].pop();
        }
        cout<<'\n';
    }

    return 0;
}