Cod sursa(job #3256855)

Utilizator edi482Eduard Vintu edi482 Data 16 noiembrie 2024 11:09:36
Problema Ciclu Eulerian Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <bits/stdc++.h>
using namespace std;
int n, m, viz[100001], v[100001], len, nrctc;
vector<int> L[100001];
vector<int> G[100001]; /// graful transpus
int c[100001]; /// c[i]=j : nodul i face parte din comp. conexa j
int X[200001], Y[200001];
/// (X[i], Y[i]) este arc
vector<int> h[100001]; /// h - listele de adiacenta
 /// pentru noul graf aciclic asociat c.t.c.

 void NewGraph()
 {
     int i, j;
     for (int p = 1; p <= m; p++)
     {
         i = X[p];
         j = Y[p];
         if (c[i] != c[j]) h[c[i]].push_back(c[j]);
     }
     for (i = 1; i <= nrctc; i++)
        sort(h[i].begin(), h[i].end());
     for (i = 1; i <= nrctc; i++)
        if (h[i].size() > 0)
         {
             for (int e : h[i])
                cout << e << " ";
            cout << "\n";
         }
        else cout << "0\n";
 }

void Citire()
{
    int i, j;
    cin >> n >> m;
    for (int p = 1; p <= m; p++)
    {
        cin >> i >> j;
        L[i].push_back(j);
        G[j].push_back(i);
        X[p] = i; Y[p] = j;
    }
}

void DFS_TF(int k)
{
    viz[k] = 1;
    for (int i : L[k])
        if (viz[i] == 0) DFS_TF(i);
    v[++len] = k;
}

void SortTop()
{
    for (int i = 1; i <= n; i++)
        if (viz[i] == 0) DFS_TF(i);
}

/// DFS obisnuit pe arce inverse
void DFS(int k)
{
    viz[k] = 1;
    c[k] = nrctc;
    for (int i : G[k])
        if (viz[i] == 0) DFS(i);
}

void Kosaraju()
{
    int i, k;
    SortTop();
    /// reinitializare
    for (i = 1; i <= n; i++)
        viz[i] = 0;
    for (i = n; i >= 1; i--)
    {
        k = v[i];
        if (viz[k] == 0)
        {
            nrctc++;
            DFS(k);
        }
    }
}

int main()
{
    Citire();
    Kosaraju();
    NewGraph();
    return 0;
}