Pagini recente » Cod sursa (job #551149) | Cod sursa (job #290280) | Cod sursa (job #2181453) | Cod sursa (job #657265) | Cod sursa (job #942457)
Cod sursa(job #942457)
#include<iostream>
#include<vector>
#include<fstream>
#define MAX 100000
#define MAX_comp 4000
using namespace std;
ifstream in("ctc.in");
ofstream out("ctc.out");
int nod_plecare,nr_comp_conexe=0;
vector <int> graf[MAX],comp_conexe[MAX_comp];
int verificare(int linie,int val ){
unsigned int i;
for( i = 0; i < comp_conexe[linie].size(); i++)
if(comp_conexe[linie][i]==val)
return 1;
return 0;
}
int ctc( int nod ,int viz[MAX]){
unsigned int i,j;
int gasire=0,nod_intermediar,verifica;
viz[nod]=1;
for ( i = 0; i < graf[nod].size(); i++ )
if((nod!=graf[nod][i])&&(graf[nod][i]==nod_plecare)){
for( j = 0 ; j < graf[nod].size(); j++ )
if((nod!=graf[nod][j])&&(graf[nod][j]!=nod_plecare))
if(viz[graf[nod][j]]==0){
nod_intermediar=nod_plecare;
nod_plecare=nod;
gasire=ctc(graf[nod][j],viz);
nod_plecare=nod_intermediar;
if(gasire==1){
verifica = verificare(nr_comp_conexe,graf[nod][j]);
if(verifica==0)
comp_conexe[nr_comp_conexe].push_back(graf[nod][j]);
}
}
verifica = verificare(nr_comp_conexe,nod);
if(verifica==0)
comp_conexe[nr_comp_conexe].push_back(nod);
return 1;
}
else
if(viz[graf[nod][i]]==0){
// nod_plecare=graf[nod][i];
gasire=ctc(graf[nod][i],viz);
//nod_plecare=nod;
if(gasire==1){
//for( j = 0 ; j < nr_comp_conexe; j++ )
//for( k = 0 ; k < comp_conexe[j].size(); k++ )
//if(comp_conexe[j][k]==i)
verifica = verificare(nr_comp_conexe,nod);
if(verifica==0)
comp_conexe[nr_comp_conexe].push_back(nod);
return 1;
}
}
return 0;
}
void afisare(){
unsigned int i;
int j;
out<<nr_comp_conexe<<endl;
for( j = 0 ; j < nr_comp_conexe ; j++ ){
for( i = 0; i < comp_conexe[j].size(); i++)
out<<comp_conexe[j][i]<<" ";
out<<endl;
}
}
/*int reuniune(){
int i,ok,ok1,nr_comp_conexe1,p,l;
unsigned int j,k,s;
nr_comp_conexe1=nr_comp_conexe;
for(p = 0 ; p < nr_comp_conexe1 ; p++)
for( i = p+1 ; i < nr_comp_conexe1; i++){
ok=0;
for( j = 0 ; j < comp_conexe[p].size(); j++ )
for( k = 0 ; k < comp_conexe[i].size() ; k++ )
if(comp_conexe[p][j]==comp_conexe[i][k])
ok++;
if(ok!=0){
for( j = 0 ; j < comp_conexe[i].size(); j++ ){
ok1=0;
for( k = 0 ; k < comp_conexe[p].size() ; k++ )
if(comp_conexe[i][j]==comp_conexe[p][k])
ok1++;
if(ok1==0)
comp_conexe[p].push_back(comp_conexe[i][j]);
}
for( l = i+1; l < nr_comp_conexe1; l++){
comp_conexe[l-1].clear();
for( s = 0 ; s < comp_conexe[l].size() ; s++ )
comp_conexe[l-1].push_back(comp_conexe[l][s]);
}
comp_conexe[nr_comp_conexe1-1].clear();
nr_comp_conexe1--;
}
}
return nr_comp_conexe1;
}*/
int main(){
int n,m,x,y,viz[MAX],exista,ok,i,j,p;
unsigned int k;
in>>n>>m;
for( i = 1; i <= m; i++){
in>>x>>y;
graf[x].push_back(y);
}
for( i = 1 ; i <= n ; i++)
viz[i]=0;
for( i = 1 ; i <= n ; i++ ){
exista=0;
for( p = 1 ; p <= n ; p++){
viz[p]=0;
}
for( j = 0 ; j < nr_comp_conexe; j++ )
for( k = 0 ; k < comp_conexe[j].size(); k++ )
if(comp_conexe[j][k]==i)
exista=1;
if(exista==0){
nod_plecare=i;
ok=ctc(i,viz);
if(ok==1){
nr_comp_conexe++;
}
}
}
afisare();
return 0;
}