Pagini recente » Cod sursa (job #1796500) | Cod sursa (job #2796350) | Cod sursa (job #2759189) | Cod sursa (job #480029) | Cod sursa (job #2928381)
#include <bits/stdc++.h>
using namespace std;
ifstream f ("ctc.in");
ofstream g("ctc.out");
int noduri, muchii;
int nrcomptconexe;
vector <vector<int>> ad;
vector <vector<int>> ad_t;
vector <vector<int>> comp;
vector <int> stiva;
vector <int> nivel;
void read()
{
int a;
f>>noduri>>muchii;
ad.resize(noduri+1);
ad_t.resize(noduri+1);
for(a=1; a<=muchii; a++)
{
int A, B;
f>>A>>B;
ad[A].push_back(B);
ad_t[B].push_back(A);
}
}
void dfs(int n)
{
for(int i=0; i<ad[n].size(); i++)
{
if(nivel[ad[n][i]]==0)
{
nivel[ad[n][i]]=1;
dfs(ad[n][i]]);
}
}
stiva.push_back(n);
}
void dfs_t(int n)
{
int j;
comp[nrcomptconexe].push_back(n);
nivel[n]=2;
for(j=0; j<ad_t[n].size(); j++)
{
if(nivel[ad_t[n][j]]==1)
dfs_t(ad_t[n][j]);
}
}
void afis()
{
int j;
g<<nrcomptconexe<<"\n";
for(j=1; j<=nrcomptconexe; j++)
{
for(int i=0; i<comp[j].size(); i++)
g<<comp[j][i];
g<<"\n";
}
}
int main()
{
int a, nod;
read();
nivel.resize(noduri+1);
comp.resize(noduri+1);
for(a=1; a<=noduri; a++)
nivel[a]=0;
for(a=1; a<=noduri; a++)
if(nivel[a]==0)
{
nivel[a]=1;
dfs(a);
}
while(stiva.empty()==0)
{
nod=stiva.back();
stiva.pop_back();
if(nivel[nod]==1)
{
nrcomptconexe++;
dfs_t(nod);
}
}
afis();
return 0;
}