Pagini recente » Cod sursa (job #2603190) | Cod sursa (job #1402310) | Cod sursa (job #831886) | Cod sursa (job #1637322) | Cod sursa (job #2202865)
#include <iostream>
#include <fstream>
#define NEVIZITAT 0
using namespace std;
ifstream in("ctc.in");
ofstream out("ctc.out");
struct elem {
int val;
elem * urm;
}*nod[100001];
struct r{
int val;
r * urm;
}*raspuns[100001];
int n, m;//date de intrare
int ids[100001], legSlaba[100001];
int nrCompo;
int stiva[150000], varf;
bool seAflaPeStiva[100001];
void adaugareNod(int din,int la){
elem * deAdaugat = new elem;
deAdaugat -> val = la;
deAdaugat -> urm = nod[din];
nod[din] = deAdaugat;
}
void citire(){
in >> n >> m;
for(int i = 1; i <= m; i++){
int x, y;
in >> x >> y;
adaugareNod(x, y);
}
in.close();
}
void DF(int plec){
seAflaPeStiva[plec] = true;//adaug nodul pe stiva
stiva[++varf] = plec;
legSlaba[plec] = ids[plec] = plec;//cel mai indepartat nod la care poate ajunge e el insusi momentan
elem * parcurg = new elem;
parcurg = nod[plec];
while(parcurg != NULL){
int catre = parcurg -> val;
if(ids[catre] == NEVIZITAT){
DF(catre);
}
if(seAflaPeStiva[catre] == true){
legSlaba[plec] = min(legSlaba[catre], legSlaba[plec]);
}
parcurg = parcurg -> urm;
}
if(ids[plec] == legSlaba[plec]){
for(int i = stiva[varf--];varf >= 0; i = stiva[varf--]){
seAflaPeStiva[i] = false;//scoatem componentele de pe stiva
legSlaba[i] = ids[plec];
r * ras = new r;
ras -> val = i;
ras -> urm = raspuns[ids[plec]];
raspuns[plec] = ras;
if(i == plec){
break;
}
}
nrCompo++;
}
}
void tarjan(){
for(int i = 1; i <= n; i++){
seAflaPeStiva[i] = false;
ids[i] = NEVIZITAT;
legSlaba[i] = 0;
}
for(int i = 1; i <= n; i++){
if(ids[i] == NEVIZITAT){
DF(i);
}
}
}
void afisare(){
out << nrCompo << '\n';
for(int i = 1; i <= n; i++){
if(raspuns[i] != NULL){
r *parcurg = new r;
parcurg = raspuns[i];
while (parcurg != NULL){
out << parcurg -> val <<' ';
parcurg = parcurg -> urm;
}
out << '\n';
}
}
}
int main() {
citire();
tarjan();
afisare();
return 0;
}