Cod sursa(job #871701)

Utilizator enedumitruene dumitru enedumitru Data 5 februarie 2013 02:37:52
Problema Componente tare conexe Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream> 
#include <vector> 
#define Nmax 100005  
using namespace std; 
ifstream f("ctc.in"); ofstream g("ctc.out");
int n,m,x,y,nr;
vector <int> Go[Nmax], Gi[Nmax], G[Nmax], adj, nodes; 
vector <int> viz; 
void DFP(const int n, vector <int>* G, vector <int>& adj)  // Marcheaza cu + 
{ 	viz[n] = 1; 
    vector <int> :: iterator it = G[n].begin(), sf=G[n].end(); 
    for (;it!=sf;++it) 
        if(!viz[*it]) 
            DFP(*it, G, adj); 
    adj.push_back(n); 
} 
void DFM(const int n, vector <int>* G, vector <int>& adj)  // Marcheaza cu - 
{ 	viz[n] = 2; 
    vector <int> ::iterator it = G[n].begin(), sf=G[n].end(); 
    for (;it!=sf;++it) 
        if (viz[*it] == 1) 
            DFM(*it, G, adj); 
    adj.push_back(n); 
}
int main(void) 
{   f >>n>>m; 
    while(m--) 
	{   f>>x>>y; x --, y --; 
        Go[x].push_back(y); Gi[y].push_back(x); 
    }  
    for (int i = 0; i < n; ++ i)  nodes.push_back(i); 
    //random_shuffle(nodes.begin(), nodes.end()); 
    viz.resize(n,0); 
    //viz.assign(viz.size(), 0); 
    for (int i = 0; i < n; ++ i) if (viz[ nodes[i] ] == 0)
	{   adj.clear(); 
        DFP(nodes[i], Go, adj); 
        DFM(nodes[i], Gi, G[nr]), nr ++; 
		vector <int> :: iterator it=adj.begin(), sf=adj.end(); 
        for(; it!=sf; ++it) 
            if (viz[*it] == 1) viz[*it] = 0; 
    } 
    g << nr <<'\n'; 
    for (int i = 0; i < nr; ++i)
	{   vector <int> :: iterator it=G[i].begin(), sf=G[i].end(); 
        for(; it!=sf ; ++it) g<<*it+1 <<" "; 
		g<< '\n'; 
    } 
    g.close(); return 0; 
}