Pagini recente » Cod sursa (job #728847) | Cod sursa (job #523057) | Cod sursa (job #2223083) | Cod sursa (job #2647945) | Cod sursa (job #2844735)
#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);
}