Pagini recente » Cod sursa (job #2526007) | Cod sursa (job #1154699) | Cod sursa (job #1995179) | Cod sursa (job #2101654) | Cod sursa (job #1370854)
#include <bits/stdc++.h>
#define pb push_back
#define DMAX 6000
using namespace std;
int n, m2;
bool p[DMAX], m[DMAX], use[DMAX];
vector <vector <int> > sol;
vector <int>v[DMAX];
vector <int>g[DMAX];
void reset()
{
for(int i=1;i<=n;i++)
p[i]=m[i]=0;
}
void dfs_plus(int k)
{
p[k]=1;
for(int i=0;i<v[k].size();i++)
{
if(p[v[k][i]]==0)
dfs_plus(v[k][i]);
}
}
void dfs_minus(int k)
{
m[k]=1;
for(int i=0;i<g[k].size();i++)
{
if(m[g[k][i]]==0)
dfs_minus(g[k][i]);
}
}
void conex()
{
vector <int> s;
for(int i=1;i<=n;i++)
if(p[i]==m[i] && m[i]==1)
{
s.pb(i);
use[i]=1;
}
if(s.size()>0)
sol.pb(s);
}
int main()
{
freopen("ctc.in", "r", stdin);
freopen("ctc.out", "w", stdout);
cin>>n>>m2;
int a, b;
for(int i=1;i<=m2;i++)
{
scanf("%i %i", &a, &b);
v[a].pb(b);
g[b].pb(a);
}
for(int i=1;i<=n;i++)
if(!use[i])
{
reset();
dfs_plus(i);
dfs_minus(i);
conex();
}
cout<<sol.size()<<'\n';
for(int i=0;i<sol.size();++i)
{
for(int j=0;j<sol[i].size();++j)
printf("%i ", sol[i][j]);//cout<<sol[i][j]<<" \n"[j==sol[i].size()-1];
printf("\n");
}
return 0;
}