Pagini recente » Cod sursa (job #1827211) | Cod sursa (job #1814953) | Cod sursa (job #2935911) | Cod sursa (job #1915177) | Cod sursa (job #2195834)
#include <fstream>
#define nmax 100000
#define mmax 200000
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
int Start[nmax+2],T[2][mmax+2],visited[nmax+2];
int n,m,Timp,X[nmax+2],nX,X2[nmax+2],nX2;
int Start2[nmax+2],T2[2][mmax+2],visited2[nmax+2];
int Starttc[nmax+2],Ttc[2][mmax+2],ntc;
void DFS(int vf){
int k,y;
visited[vf]=1;
for(k=Start[vf];k!=0;k=T[1][k]){
y=T[0][k];///vecin cu vf
if(visited[y]==0){
DFS(y);
}
}
Timp++;
X[n+1-Timp]=vf;
}
void sortare_topologica(){
int k,r,j;
for(k=1;k<=n;k++)visited[k]=0;
Timp=0;
for(k=1;k<=n;k++){
if(visited[k]==0){
///k face parte din componenta conexa noua
DFS(k);
}
}
///X contine cele n varfuri sortate descrescator dupa timpii finali
}
void DFS2(int vf){
int k,y;
visited2[vf]=1;
///se depoziteaza in X2[] varful parcurs
nX2++; X2[nX2]=vf;
for(k=Start2[vf];k!=0;k=T2[1][k]){
y=T2[0][k];///vecin cu vf
if(visited2[y]==0){
DFS2(y);
}
}
}
void determinarea_componentelor_tare_conexe(){
int k,r,j;
for(k=1;k<=n;k++)visited2[k]=0;
ntc=0; r=0;
for(k=1;k<=n;k++){
if(visited2[X[k]]==0){
///X[k] face parte din componenta tare conexa noua
ntc++;Starttc[ntc]=0;
nX2=0;
DFS2(X[k]);
for(j=1;j<=nX2;j++){
r++; Ttc[0][r]=X2[j]; Ttc[1][r]=Starttc[ntc];
Starttc[ntc]=r;
}
}
}
///afisarea numarului componentelor tare conexe si a elementelor lor
fout<<ntc<<'\n';
for(k=1;k<=ntc;k++){
for(j=Starttc[k];j!=0;j=Ttc[1][j]){
fout<<Ttc[0][j]<<' ';
}
fout<<'\n';
}
}
void citire_graf_orientat_liste_adiacenta(){
int i,j,k,r;
fin>>n>>m;
for(k=1;k<=n;k++)Start[k]=0;
r=0;
for(k=1;k<=m;k++){
fin>>i>>j;
r++;
T[0][r]=j;///in linia 0 asezam vecinii
///in linia 1 asezam pozitia celui anterior
T[1][r]=Start[i];
Start[i]=r;
}
}
int main(){
citire_graf_orientat_liste_adiacenta();
///sortam topologic cele n varfuri
sortare_topologica();
///construirea listelor de adiacenta pentru graful complementar
for(int i=1;i<=n;i++)Start2[i]=0;
int r=0;
for(int k=1;k<=n;k++){
for(int i=Start[k];i!=0;i=T[1][i]){
r++;
int j=T[0][i];
T2[0][r]=k; T2[1][r]=Start2[j];
Start2[j]=r;
}
}
determinarea_componentelor_tare_conexe();
fout.close(); fin.close();
return 0;
}