Pagini recente » Cod sursa (job #419352) | Cod sursa (job #1205387) | Cod sursa (job #986114) | Cod sursa (job #1599859) | Cod sursa (job #844242)
Cod sursa(job #844242)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <queue>
#include <deque>
using namespace std;
ifstream f("biconex.in");
ofstream g("biconex.out");
#define nmax 100005
#define ll long long
int n, m, t[nmax], Min[nmax], nivel[nmax];
bool viz[nmax];
vector<int> gf[nmax], comp[nmax];
int cnt;
deque< pair<int,int> > dq;
void citeste(){
f >> n >> m;
int x, y;
for(int i=1; i<=m; ++i){
f >> x >> y;
gf[x].push_back( y );
gf[y].push_back(x);
}
}
void baga_comp(int nod, int vc){
++cnt;// apare o noua componenta
int X = dq.back().first; int Y = dq.back().second;
dq.pop_back();
while ( (X != nod || Y != vc) && (X != vc || Y != nod) ){//cat timp nu am dat de muchia critica
comp[cnt].push_back(X); comp[cnt].push_back(Y);
X = dq.back().first; Y = dq.back().second;
dq.pop_back();
}
comp[cnt].push_back(X); comp[cnt].push_back(Y);
}
void dfs(int nod){
viz[nod] = 1;
for(int i=0; i<gf[nod].size(); ++i){
int vc = gf[nod][i];
if (viz[vc] == 0){
t[vc] = nod;
nivel[vc] = Min[vc] = nivel[nod] + 1;
dq.push_back( make_pair( nod, vc ) );
dfs(vc);
Min[nod] = min(Min[nod], Min[vc]);
if (Min[vc] >= nivel[nod]){//daca nod e nod critic
baga_comp(nod, vc);
}
}else{//ma folosesc de o muchie de intoarcere
if (t[nod] != vc){// daca nu e tatal lui nod
Min[nod] = min(Min[nod], nivel[vc]);
}
}
}
}
void rezolva(){
// o comp biconexa e o comp ce nu contine noduri critice;
for(int i=1; i<=n; ++i){// nu zice ca e graf conex(in enunt)
if (viz[i] == 0){
dfs(i);
}
}
//cout << cnt << "\n";
g << cnt << "\n";
for(int i=1; i<=cnt; ++i){
sort(comp[i].begin(), comp[i].end());
for(int j=1; j<comp[i].size(); ++j){
if (comp[i][j-1] != comp[i][j])
//cout << comp[i][j-1] << " ",
g << comp[i][j-1] << " ";
}
//cout << comp[i][ comp[i].size()-1 ] << " ",
g << comp[i][ comp[i].size()-1 ] << " ";
//cout << "\n";
g << "\n";
}
}
int main(){
citeste();
rezolva();
f.close();
g.close();
return 0;
}