Cod sursa(job #1067413)

Utilizator IonMosnoiIon Mosnoi IonMosnoi Data 26 decembrie 2013 19:55:16
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.28 kb
#include<fstream>
#include<vector>
#define pb push_back

using namespace std;

const int maxn = 100000;

 vector <int> a[maxn],b[maxn/2];
 int n,m,p[maxn],c[maxn],check[maxn],sol=0;
  
 
 void parc1(int nod)
{
	p[nod]=1;
	for(int j=0;j<a[nod].size();++j)
    		if(!p[a[nod][j]] && !check[a[nod][j]])parc1(a[nod][j]);

}
int parc2(int find,int nod){
//	bool t=false;
	 c[nod]=1;
	 if(find==nod)return true;//t=true;
     //if(t)return t;
	 for(int j=0;j<a[nod].size();++j){
    		if(!c[a[nod][j]] && (!check[a[nod][j]] || a[nod][j]==find || true) && p[a[nod][j]]==1) if(parc2(find,a[nod][j]))return true;//t=true;	
    		//if(t)return t;
    	}
return false;//t;
}

main(){
  ifstream fin("ctc.in");
  ofstream fout("ctc.out"); 
   
  fin>>n>>m;
  int x,y;
  for(int i = 1; i<=m;++i){
  	fin>>x>>y;
  	a[x].pb(y);
  } 
  
 /* for(int k=1;k<=n;++k){
  	 for(int l=0;l<a[k].size();++l)fout<<a[k][l]<<" ";
	   fout<<"\n";
  }*/
  
  
  // parc1(1); 
    
  // if(parc2(1,2))fout<<2;
   
   int nod;
   
  // memset( check1, 0, sizeof( check1 ) );
  for(int k=0;k<=n;check[++k]=0);
   
    for(int j=1;j<=n;++j)  {
    	if(!check[j]){
    	//
		    nod=j;
		  // memset( p, 0, sizeof( p ) );    	 
		  for(int k=0;k<=n;p[++k]=0);
		   parc1(nod);   
		   for(int i=1;i<=n;i++){		   	
		   	if(!check[i] && i!=nod && p[i]){
		   		//memset( c, 0, sizeof( c ) );
		   		for(int k=0;k<=n;c[++k]=0);
		   		
		   		if(parc2(nod,i)){
		   			if(!check[nod]){
		   				sol++;
		   				check[nod]=1; // fout<<nod<<" "; 			
		   				b[sol].pb(nod);
		   			}   			
		   				b[sol].pb(i);
		   			//	fout<<i<<" ";
		   				check[i]=1;   			
		   		}
		   	}
		   }
		   check[nod]=1;
		 // fout<<"\n";
		  // for(int k=1;k<=n;++k)fout<<check[k]<<" ";fout<<")\n";
		 //  for(int k=1;k<=n;++k)fout<<p[k]<<" ";fout<<"(\n";
    }
	}
  
    fout<<sol<<"\n";
	 for(int j=1;j<=sol;++j){
	 	for(int i=0;i<b[j].size();i++)fout<<b[j][i]<<" ";
	 	fout<<"\n";
	 } 
	 
	 
	 //for(int k=1;k<=n;++k)fout<<check[k]<<"\n";
   
   
 /*   while(ig<=sg){
    	for(int j=0;j<=a[c[ig]].size();++j){
    		if(!p[a[c[ig]][j]]){
    			c[++sg]=a[c[ig]][j];
    			check[a[c[ig]][j]]++;
    		}    		
    	}
    	++ig;
    }*/
   
 
  fin.close(); fout.close();  
}