Pagini recente » Cod sursa (job #3278874) | Cod sursa (job #1249787) | Cod sursa (job #598739) | Cod sursa (job #427553) | Cod sursa (job #1913659)
#include <bits/stdc++.h>
using namespace std;
vector <int> v[50005];
vector <int> vt[50005];
vector <int> tare[50005];
int n,m,i,comp,nr,vect[50005],viz[50005],x,y,j;
struct andreea
{
int poz, unu;
}ras[50005];
bool cmp(andreea a, andreea b)
{
if(a.unu>=b.unu)return 0;
return 1;
}
void dfs(int nod)
{
int i;
viz[nod]=1;
for(i=0;i<v[nod].size();i++)
if(viz[v[nod][i]]==0)dfs(v[nod][i]);
nr++;
vect[nr]=nod;
}
void dfp(int nod)
{
int i;
viz[nod]=2;
tare[comp].push_back(nod);
for(i=0;i<vt[nod].size();i++)
if(viz[vt[nod][i]]==1)dfp(vt[nod][i]);
}
int main()
{
freopen("ctc.in","r",stdin);
freopen("ctc.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
v[x].push_back(y);
vt[y].push_back(x);
}
for(i=1;i<=n;i++)
{
if(viz[i]==0)
{
dfs(i);
}
}
for(i=nr;i>=1;i--)
{
if(viz[vect[i]]==1)
{
comp++;
dfp(vect[i]);
}
}
printf("%d",comp);
for(i=1;i<=comp;i++)
{
ras[i].poz=i;
ras[i].unu=n+2;
for(j=0;j<tare[i].size();j++)
if(ras[i].unu>tare[i][j])ras[i].unu=tare[i][j];
}
sort(ras+1,ras+comp+1,cmp);
for(i=1;i<=comp;i++)
{
printf("\n");
// printf("\n%d ",tare[ras[i].poz].size());
sort(tare[i].begin(),tare[i].end());
for(j=0;j<tare[ras[i].poz].size();j++)
printf("%d ",tare[ras[i].poz][j]);
}
return 0;
}