Cod sursa(job #1430409)

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

using namespace std;

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

void dfs(int x,int w) {
    v[x] = 1;
    int i;
    if (!w) {
        for (i=0;(unsigned)i<m[x].size();i++) {
            if (!v[m[x][i]]) {
                dfs(m[x][i],w);
            }
        }
    }
    else
        for (i=0;(unsigned)i<m1[x].size();i++) {
            if (!v[m1[x][i]]) {
                dfs(m1[x][i],w);
            }
        }
    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,0);
    m1 = new vector<int>[n+1];
    for (i=1;i<=n;i++)
        for (j=0;(unsigned)j<m[i].size();j++)
            m1[m[i][j]].push_back(i);
    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,1);
            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;
}