Pagini recente » Cod sursa (job #1530494) | Cod sursa (job #2522177) | Cod sursa (job #2345013) | Cod sursa (job #586190) | Cod sursa (job #871701)
Cod sursa(job #871701)
#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;
}