Cod sursa(job #1004401)

Utilizator muresan_bogdanMuresan Bogdan muresan_bogdan Data 2 octombrie 2013 18:06:12
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.43 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<stack>
using namespace std;

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

struct node {
    bool vizitat;
    int mini;
    int grad;
    vector<int> vecini;
};

struct cuplu {
    int a;
    int b;
};

int n, m, i, ii, a, b, s1, s2;
node nodes[100001];
cuplu muchie, muchie2;
stack<cuplu> stiva;
vector<int> sol;
vector<vector<int> > solutie;

void dfs(int x) {
    int j;
    int l = nodes[x].vecini.size();
    for(j = 0; j < l; j++) {
        int vecin = nodes[x].vecini[j];
        //cout << "nod: " << x << '(' << nodes[x].mini << ')' << "-vecin: " << vecin << '(' << nodes[vecin].mini << ")\n";
        if(nodes[vecin].vizitat == false) {
            muchie.a = x;
            muchie.b = vecin;
            stiva.push(muchie);
            nodes[vecin].vizitat = true;
            nodes[vecin].grad = nodes[vecin].mini = nodes[x].grad + 1;
            dfs(vecin);
            nodes[x].mini = min(nodes[x].mini, nodes[vecin].mini);
            //cout << "nod: "<< x << '(' << nodes[x].mini << ")-vecin: " << vecin << '(' << nodes[vecin].mini << ")\n";
            if(nodes[vecin].mini == nodes[x].mini) {  //trebuie verificat
                muchie2 = stiva.top();
                stiva.pop();
                sol.push_back(muchie2.b);
            }
            else {
                sol.push_back(muchie2.a);
                stiva.pop();
                solutie.push_back(sol);
                sol.clear();
            }
        }
        else {
            nodes[x].mini = min(nodes[x].mini, nodes[vecin].mini);
            //cout << "nod': " << x << '(' << nodes[x].mini << ")\n";
        }
    }
}

int main() {
    fin >> n >> m;
    for(i = 0; i < m; i++) {
        fin >> a >> b;
        nodes[a].vecini.push_back(b);
    }
    for(i = 1; i <= n; i++) {
        if(nodes[i].vizitat == false) {
            nodes[i].grad = i;
            nodes[i].mini = i;
            nodes[i].vizitat = true;
            dfs(i);
        }
        sol.push_back(i);
        solutie.push_back(sol);
        sol.clear();
    }
    s1 = solutie.size();
    fout << s1 << '\n';
    for(i = s1 - 1; i >= 0; i--) {
        sol = solutie[i];
        s2 = sol.size();
        for(ii = s2 - 1; ii >= 0; ii--) {
            fout << sol[ii] << ' ';
        }
        fout << '\n';
    }
    fin.close();
    fout.close();
    return 0;
}