Pagini recente » Cod sursa (job #1578401) | Cod sursa (job #85068) | Cod sursa (job #516567) | Cod sursa (job #1145715) | Cod sursa (job #2928819)
#include <fstream>
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
//Pentru a afla nr de componente tare conexe(pt oricare doua noduri i si j, exista nod de la i la j si de la j la i), voi folosi algoritmul lui kosaraju.
int N,M, x, y;
stack<int> stiva;
vector<vector<int>> lista_adiacenta;
vector<vector<int>> lista_transpus;
vector<bool> vizitat_1;
vector<bool> vizitat_2;
int nr;
vector<vector<int>> ctc;
void dfs(int nod){
vizitat_1[nod]= true;
for(auto i: lista_adiacenta[nod]){
if(!vizitat_1[i]) dfs(i);
}
stiva.push(nod);
}
void dfs_transpus(int nod){
ctc[nr].push_back(nod);
vizitat_2[nod]= true;
for(auto i: lista_transpus[nod]){
if(!vizitat_2[i]) dfs_transpus(i);
}
}
int main(){
ifstream f("ctc.in");
ofstream g("ctc.out");
f>>N>>M;
lista_adiacenta.resize(N+1);
lista_transpus.resize(N+1);
vizitat_1.resize(N+1, false);
vizitat_2.resize(N+1, false);
ctc.resize(N+1);
//formam lista de adiacenta
for(int i=1; i<=M;i++){
f>>x>>y;
lista_adiacenta[x].push_back(y);
lista_transpus[y].push_back(x);
}
f.close();
dfs(1);
while(!stiva.empty()){
int a= stiva.top();
stiva.pop();
if(!vizitat_2[a]){nr++;
dfs_transpus(a);}
}
g<<nr<<endl;
for(int i=1; i<=nr; i++){
for(int j=0; j< ctc[i].size(); j++) g<<ctc[i][j]<<" ";
g<<endl;
}
return 0;
}