Pagini recente » Cod sursa (job #511079) | Cod sursa (job #303556) | Cod sursa (job #177321) | Istoria paginii utilizator/eduard6421 | Cod sursa (job #361043)
Cod sursa(job #361043)
#include <stdio.h>
#include <algorithm>
#include <vector>
#define nmax 50005
using namespace std;
FILE*f=fopen("retele.in","r");
FILE*g=fopen("retele.out","w");
int viz[nmax],postord[nmax],ordineafis[2][nmax],n,m,nr;
vector <int> graf[nmax],graft[nmax],solutie[nmax];
void citire(){
int nod,nod2;
fscanf(f,"%d %d",&n,&m);
for(int i=0;i<m;i++){
fscanf(f,"%d %d",&nod,&nod2);
graf[nod].push_back(nod2);
graft[nod2].push_back(nod);
}
}
void dfs(int x){
viz[x]=1;
for(int i=0;i<graf[x].size();i++){
if(!viz[graf[x][i]]){
dfs(graf[x][i]);
}
}
postord[++nr]=x;
}
void dfst(int x){
viz[x]=0;
solutie[nr].push_back(x);
for(int i=0;i<graft[x].size();i++){
if(viz[graft[x][i]]){
dfst(graft[x][i]);
}
}
}
void ctc(){
int i;
for(i=1;i<=n;i++){
if(!viz[i]){
dfs(i);
}
}
nr=0;
for(i=n;i>0;i--){
if(viz[postord[i]]){
++nr;
dfst(postord[i]);
}
}
}
int comparare(vector <int> a,vector <int> b){
return a[0]<b[0];
}
void sortare(){
int i;
for(i=1;i<=nr;i++){
sort(solutie[i].begin(),solutie[i].end());
}
sort(solutie+1,solutie+nr+1,comparare);
}
void afis(){
int i,j;
fprintf(g,"%d\n",nr);
for(i=1;i<=nr;i++){
fprintf(g,"%d ",solutie[i].size());
for(j=0;j<solutie[i].size();j++){
fprintf(g,"%d ",solutie[i][j]);
}
fprintf(g,"\n");
}
}
int main(){
citire();
ctc();
sortare();
afis();
fclose(f);
fclose(g);
return 0;
}