Cod sursa(job #1430407)

Utilizator sing_exFMIGhita Tudor sing_ex Data 8 mai 2015 13:13:14
Problema Componente tare conexe Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <vector>

using namespace std;

int n,*v;
stack<int> s;
vector<int> *m;

void dfs(int x) {
    v[x] = 1;
    int i;
    for (i=0;(unsigned)i<m[x].size();i++) {
        if (!v[m[x][i]]) {
            dfs(m[x][i]);
        }
    }
    s.push(x);
}

int main()
{
    int i,j,x,y,c = 0;
    ifstream f("ctc.in");
    f>>n>>i;
    v = new int[n+1];
    for (i=1;i<=n;i++) v[i] = 0;
    m = new vector<int>[n+1];
    while (f>>x>>y) m[x].push_back(y);
    f.close();
    for (i=1;i<=n;i++)
        if (!v[i]) dfs(i);
    vector<int> m1[n+1];
    for (i=1;i<=n;i++)
        for (j=0;(unsigned)j<m[i].size();j++)
            m1[m[i][j]].push_back(i);
    for (i=1;i<=n;i++) m[i].clear();
    for (i=1;i<=n;i++)
        for (j=0;(unsigned)j<m1[i].size();j++)
            m[i].push_back(m1[i][j]);
    stack<int> s1 = stack<int>(s);
    stack<int> s2 = stack<int>(s);
    stack<int> *p;
    ofstream g("ctc.out");
    int sw = 0;
    while (sw < 2) {
        for (i=1;i<=n;i++) v[i] = 0;
        if (!sw) p = &s1;
        else p = &s2;
        while (!p->empty()) {
            while (!s.empty()) s.pop();
            x = p->top();
            p->pop();
            if (v[x]) continue;
            dfs(x);
            if (sw) {
                while (!s.empty()) {
                    g<<s.top()<<" ";
                    s.pop();
                }
                g<<endl;
            }
            else c++;
        }
        sw++;
        if (sw == 1) g<<c<<endl;
    }
    g.close();
    return 0;
}