Cod sursa(job #2925909)

Utilizator gizzehhhAsavoaei Bianca Gabriela gizzehhh Data 16 octombrie 2022 13:18:02
Problema Componente tare conexe Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#include <bits/stdc++.h>
#define N 200005
#define M 200005

using namespace std;

ifstream fin("ctc.in");
ofstream fout("ctc.out");

int G[N][N];
int disc[N] = {-1}, lowLink[N] = {-1};
bool stkItem[N];
stack <int> stk;

int viz[N];
int n, m, i, j, x, y;

int min(int a, int b) {
    if( a < b) return a;
    return b;
}

void Input(){
    fin >> n >> m;
    for(i=1; i<=m; i++)
    {
        fin >> x >> y;
        G[x][y] = 1;
        G[y][x] = 1;
    }
}

void findComponent(int node){
    static int time = 0;
    disc[node] = lowLink[node] = ++time;
    stk.push(node);
    stkItem[node] = 1;

    for( i = 0; i < n; i++)
          if(G[node][i] == 1)
              if(disc[i] == -1) {
                  findComponent(i);
                  lowLink[node] = min (lowLink[node], lowLink[i]);
              }
              else if(stkItem[i]==1)
                      lowLink[node] = min (lowLink[node], disc[i]);


     int poppedItem = 0;
     if(lowLink[node] == disc[node]){
         while(stk.top() != node) {
             poppedItem = stk.top();
             fout << poppedItem <<" ";
             stkItem[poppedItem] = 0;
         }

         poppedItem = stk.top();
         fout << poppedItem <<"\n";
         stkItem[poppedItem] = 0;
         stk.pop();
     }

}

void SCC(){
    for(i = 0; i < n; i++)
          if(disc[i] == -1)
              findComponent(i);
}

int main()
{
    Input();
    SCC();
    return 0;
}