Cod sursa(job #2844735)

Utilizator Tudor_IlieIlie Tudor Tudor_Ilie Data 5 februarie 2022 11:51:52
Problema Componente biconexe Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.62 kb
#include <iostream>
#include <stack>
#include <vector>
#include <fstream>
#include <set>
using namespace std;

ifstream in("biconex.in");
ofstream out("biconex.out");

struct InfoNod{
    int nivel=1;
    int nivel_min;
    int viz=0;
};
struct Muchie{
    int x,y;
};
vector<vector<int>> L;
vector<InfoNod> InfoNoduri;

void citire(vector<vector<int>> &L){
    int n,m;
    in>>n>>m;

    L.resize(n+1);
    InfoNoduri.resize(n+1);

    for(int i=0;i<m;i++){
        int  x,y;
        in>>x>>y;
        L[x].push_back(y);
        L[y].push_back(x);
    }
}
stack<Muchie> S;
vector<vector<Muchie>> rez;
void biconex(int i){
    InfoNoduri[i].viz = 1;
    InfoNoduri[i].nivel_min = InfoNoduri[i].nivel;
    for(auto vecin: L[i]){
        if(InfoNoduri[vecin].viz==0){
            InfoNoduri[vecin].nivel=InfoNoduri[i].nivel+1;

            Muchie m;
            m.x=i;
            m.y=vecin;

            S.push(m);

            biconex(vecin);

            InfoNoduri[i].nivel_min=min(InfoNoduri[i].nivel_min,(min(InfoNoduri[i].nivel,InfoNoduri[vecin].nivel_min)));

            if(InfoNoduri[vecin].nivel_min>=InfoNoduri[i].nivel){

                    Muchie ij;
                    vector<Muchie> temp;
                    do{
                        ij = S.top();

                        S.pop();
                        temp.push_back(ij);
                    }while(!S.empty() && !(ij.x==i || ij.y==vecin));

                    rez.push_back(temp);
            }


        }
        else{
            if(InfoNoduri[vecin].nivel<InfoNoduri[i].nivel-1){
                InfoNoduri[i].nivel_min=min(InfoNoduri[i].nivel,InfoNoduri[vecin].nivel);

                Muchie m;
                m.x=i;
                m.y=vecin;

                S.push(m);
            }
        }
    }

}
vector<set<int>> representation_conversion(vector<vector<Muchie>> &toConvert){
        vector<set<int>> rez;
        for(auto e:toConvert){
            set<int> s;
            for(auto muchie:e){
                s.insert(muchie.x);
                s.insert(muchie.y);
            }
            rez.push_back(s);
        }
        return rez;
}
void afisareL(vector<vector<int>> L){
    int ind=0;
    for(auto i:L){
        cout<<ind++<<" : ";
        for(auto j:i){
            cout<<j<<" ";
        }
        cout<<'\n';
    }
}


int main(){
    citire(L);
    biconex(1);
    vector<set<int>> nod_form = representation_conversion(rez);
    for(auto e:nod_form){
        for(auto nod:e){
            out<<nod<<' ';
        }
    out<<'\n';
    }
//    afisareL(L);



}