Cod sursa(job #1376603)

Utilizator teoionescuIonescu Teodor teoionescu Data 5 martie 2015 18:01:32
Problema Componente biconexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<fstream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<string>
#include<queue>
#include<cstdlib>
#include<ctime>
#define abs(x) ((x>0)?(x):(-(x)))
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
ifstream in("biconex.in");
ofstream out("biconex.out");
const int Nmax = 100001;
vector<int> G[Nmax],ans[Nmax];
int T[Nmax],L[Nmax];
int h[Nmax],s[Nmax];
int N,M,K;
void dfs(int x,int l){
    h[x]=L[x]=l;
    s[++s[0]]=x;
    for(vector<int>::iterator it=G[x].begin();it!=G[x].end();++it) if(*it!=T[x]) {
        if(!L[*it]){
            int es=s[0];
            T[*it]=x;
            dfs(*it,l+1);
            if(h[*it]>=l){
                K++;
                while(s[0]!=es) ans[K].push_back(s[s[0]--]);
                ans[K].push_back(x);
            }
            h[x]=min(h[x],h[*it]);
        }
        else h[x]=min(h[x],L[*it]);
    }
}
int main(){
    in>>N>>M;
    int x,y;
    for(int i=1;i<=M;i++){
        in>>x>>y;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    dfs(1,1);
    out<<K<<'\n';
    for(int i=1;i<=K;i++){
        sort(ans[i].begin(),ans[i].end());
        for(vector<int>::iterator it=ans[i].begin();it!=ans[i].end();++it) out<<*it<<' ';
        out<<'\n';
    }
    return 0;
}