Pagini recente » Cod sursa (job #1537269) | Cod sursa (job #1920306) | Cod sursa (job #1238430) | Cod sursa (job #2158010) | Cod sursa (job #2823317)
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
const int M=100005;
int n,m,k,x,y,id[M],lkey[M],inst[M],timp,nr,nrmax,nrc;
vector < int > v[M],sol[M];
stack < int > st;
bool cmp(vector < int > a, vector < int > b)
{
return *a.begin()<*b.begin();
}
void DFS(int nod)
{
st.push(nod);
id[nod]=lkey[nod]=++timp;
inst[nod]=1;
for(auto vec : v[nod])
if(!lkey[vec])
{
DFS(vec);
lkey[nod]=min(lkey[nod],lkey[vec]);
}
else if(inst[vec])
lkey[nod]=min(lkey[nod],lkey[vec]);
if(lkey[nod]==id[nod])
{
nrc++;
do
{
x=st.top();
sol[nrc].push_back(x);
inst[x]=0;
st.pop();
} while(x!=nod);
}
}
int main()
{
fin >> n >> m;
while(m--)
{
fin >> x >> y;
v[x].push_back(y);
}
for(int i=1;i<=n;i++)
if(!lkey[i])
DFS(i);
for(int i=1;i<=n;i++)
if(lkey[k]==lkey[i])
nr++;
for(int i=1;i<=nrc;i++)
sort(sol[i].begin(),sol[i].end());
sort(sol+1,sol+nrc+1,cmp);
fout << nrc << '\n';
for(int i=1;i<=nrc;i++)
{
for(auto af : sol[i])
fout << af << " ";
fout << '\n';
}
return 0;
}