Pagini recente » Cod sursa (job #113277) | Cod sursa (job #1861501) | Cod sursa (job #921583) | Cod sursa (job #1257858) | Cod sursa (job #2928592)
#include <iostream>
#include <vector>
#include <fstream>
#include <stack>
std::ifstream f("ctc.in");
std::ofstream g("ctc.out");
std::vector<int> viz(100001, 0);
std::vector<std::vector<int>> graf(100001);
std::stack<int> coada;
std::vector<std::vector<int>> graf_transpus(100001);
std::vector<std::vector<int>> solutie(100001);
int nrctc;
void dfs(int nod)
{
viz[nod] = 1;
for(auto &i:graf[nod]){
if(!viz[i]){
dfs(i);
}
}
coada.push(nod);
}
void dfsutil(int nod){
viz[nod] = 1;
solutie[nrctc].push_back(nod);
for(auto &i:graf_transpus[nod]){
if(viz[i] == 0)
{
dfsutil(i);
}
}
}
int main() {
int n, m;
f>>n>>m;
for(int i = 1; i<=m; i++){
int x,y;
f>>x>>y;
graf[x].push_back(y);
}
for(int i = 1; i<=n; i++)
if(!viz[i]) {
dfs(i);
}
// while(!coada.empty()){
// std::cout<<coada.top()<<" ";
// coada.pop();
// }
for(int i = 1; i<=n; i++){
for(auto &vecini:graf[i])
{
graf_transpus[vecini].push_back(i);
}
}
for(int i = 1; i<=n; i++) {
viz[i] = 0;//Pregatim vectorul viz pt al doilea DFS pe graful transpus
}
while(!coada.empty()){
int v = coada.top();
coada.pop();
if(viz[v] == 0){
dfsutil(v);
nrctc++;
}
}
g<<nrctc<<"\n";
for(auto &comp_conexa:solutie){
for(auto &nod:comp_conexa){
g<<nod<<" ";
}
g<<"\n";
}
// std::cout<<"\n";
// for(int i = 1; i<=n; i++)
// {
// std::cout<<i<<": ";
// for(auto &j:graf_transpus[i])
// std::cout<<j<<", ";
// std::cout<<"\n";
// }
return 0;
}