Pagini recente » Cod sursa (job #2547458) | Cod sursa (job #3143737) | Cod sursa (job #927017) | Cod sursa (job #1366810) | Cod sursa (job #871703)
Cod sursa(job #871703)
#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;
}