Cod sursa(job #871703)

Utilizator enedumitruene dumitru enedumitru Data 5 februarie 2013 02:48:19
Problema Componente tare conexe Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 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,i;
vector <int> Go[Nmax], Gi[Nmax], G[Nmax], adj, 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); 
    }  
    viz.resize(n); 
    for(i=0;i<n;++i) 
		if(!viz[i])
		{   adj.clear(); 
			DFP(i, Go, adj); 
			DFM(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(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; 
}