Pagini recente » Cod sursa (job #2879693) | Cod sursa (job #2178835) | Cod sursa (job #83070) | Cod sursa (job #320165) | Cod sursa (job #2429502)
#include <cstdio>
#include<vector>
using namespace std;
vector <int>G[100001];
vector<int>G2[100001];
vector <int>comp[100001];
vector <int> q;
bool viz[100001];
int viz2[100001];
void visit(int nod)
{
int i;
viz[nod]=1;
for(i=0;i<G[nod].size();i++)
if(!viz[G[nod][i]])
visit(G[nod][i]);
q.push_back(nod);
}
void ass(int nod,int root)
{
int i;
viz2[nod]=root;
comp[root].push_back(nod);
for(i=0;i<G2[nod].size();i++)
if(!viz2[G2[nod][i]])
ass(G2[nod][i],root);
}
int main()
{
freopen("ctc.in","r",stdin);
freopen("ctc.out","w",stdout);
int n,m,i,a,b,cnt=0;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
G[a].push_back(b);
G2[b].push_back(a);
}
for(i=1;i<=n;i++)
if(viz[i]==0){
viz[i]=1;
visit(i);
}
for(i=q.size()-1;i>=0;i--)
{
if(viz2[q[i]]==0)
{
viz2[q[i]]=q[i];
cnt++;
ass(q[i],q[i]);
}
q.pop_back();
}
printf("%d\n",cnt);
for(i=1;i<=n;i++)
{
for(int j=0;j<comp[i].size();j++)
printf("%d ",comp[i][j]);
if(comp[i].size()>=1)
printf("\n");
}
return 0;
}