Pagini recente » Cod sursa (job #760590) | Cod sursa (job #1988784) | Cod sursa (job #1827793) | Cod sursa (job #790961) | Cod sursa (job #2929243)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
int nrTotalComponente = 0;
int arrayNoduri[10000];
int pozitiiDeNewline[10000];
int index;
void DFS1(int i,vector<int>& visited,stack<int>& mystack, vector<vector<int>>& listaAdiacenta) // parcurgere DFS pe graful normal
{
visited[i]=true;
for(int j: listaAdiacenta[i]) //parcurgem folosind DFS din fiecare nod
if(visited[j]==false)
DFS1(j,visited,mystack,listaAdiacenta);
mystack.push(i); //cand finalizam o parcurgere DFS, punem nodul pe stiva , conform alg lui Kosaraju
}
void DFS2(int i,vector<int>& visited, vector<vector<int>>& listaReversed) //DFS pe graful transpus
{
arrayNoduri[index]=i;
index++;
// fout<<arrayNoduri[index++]<<" ";
// fout<<i<<" "; //afisam direct nodurile
visited[i] = true;
for(int j: listaReversed[i])
if(!visited[j])
DFS2(j,visited,listaReversed);
}
void findSCCs(vector<vector<int>>& listaAdiacenta, vector<vector<int>>& listaReversed, int n)
{
stack<int> mystack; //stiva pentru prima parcurgere DFS
vector<int> visited(n+1,0); //pentru nodurile vizitate
for(int i=1;i<n+1;++i)
if(!visited[i])
DFS1(i,visited,mystack,listaAdiacenta); //aplicam DFS pe nodurile nevizitate pentru a incarca stiva
for(int i=1;i<n+1;++i)
visited[i] = false; //resetam array-ul de noduri vizitate pentru a doua parcurgere
// cout<<"componente:\n";
while(!mystack.empty())
{
int curr = mystack.top();
mystack.pop(); //extragem primul element din stiva
if(visited[curr]==0)
{
DFS2(curr,visited,listaReversed); //daca nodul e nevizitat aplicam DFS pe graful transpus din acel nod
cout<<index<<"\n";
pozitiiDeNewline[index]=1;
// cout<<arrayNoduri[index]<<" ";
// fout<<"\n";
nrTotalComponente++;
}
}
// fout<<nrTotalComponente<<"\n";
}
int main()
{
int n,m;
fin>>n>>m;
vector<vector<int>> listaAdiacenta(n+1), listaReversed(n+1);
for(int i=0;i<n;i++)
arrayNoduri[i]=-1;
for(int i=0;i<n;i++)
pozitiiDeNewline[i]=-1;
int x,y;
while(m--){
fin>>x>>y;
listaAdiacenta[x].push_back(y);
listaReversed[y].push_back(x);
}
findSCCs(listaAdiacenta, listaReversed, n);
fout<<nrTotalComponente<<'\n';
for(int i=0;i<index;i++)
{
if(pozitiiDeNewline[i]==-1)
fout<<arrayNoduri[i]<<" ";
else if(pozitiiDeNewline[i]==1)
fout<<"\n"<<arrayNoduri[i]<<" ";
}
for(int i=0;i<=index;i++)
cout<<pozitiiDeNewline[i]<<" ";
return 0;
}
//TIME COMPLEXITY: O(N+M)