Pagini recente » Cod sursa (job #2473006) | Cod sursa (job #2717147) | Cod sursa (job #2880754) | Cod sursa (job #178714) | Cod sursa (job #770755)
Cod sursa(job #770755)
/*
Componente tare conexe.
*/
#include <iostream>
#include <vector>
#include <algorithm>
#include <stdio.h>
#define MAXN 100050
using namespace std;
int nr_noduri, nr_muchii, nr_comp_conexe;
vector<int> graf_init[MAXN], graf_transpus[MAXN], graf[MAXN];
vector<int> stiva, vizitat, componenta;
void dfs (int u) {
int i;
vizitat[u] = true;
for (i = 0; i < graf_init[u].size(); i++)
if (vizitat[graf_init[u][i]] == false)
dfs(graf_init[u][i]);
stiva.push_back(u);
}
void kosaraju (int u) {
int i;
componenta[u] = nr_comp_conexe;
for (i = 0; i < graf_transpus[u].size(); i++)
if (componenta[graf_transpus[u][i]] == -1)
kosaraju(graf_transpus[u][i]);
}
int main () {
freopen("ctc.in", "r", stdin);
freopen("ctc.out", "w", stdout);
int i, j, x, y;
scanf("%d %d", &nr_noduri, &nr_muchii);
for (i = 0; i < nr_muchii; i++) {
scanf("%d %d", &x, &y);
graf_init[x].push_back(y);
graf_transpus[y].push_back(x);
}
vizitat.resize(nr_noduri);
vizitat.assign(vizitat.size(), 0);
for (i = 0; i < nr_noduri; i++)
if (vizitat[i] == false)
dfs(i);
componenta.resize(nr_noduri);
componenta.assign(componenta.size(), -1);
nr_comp_conexe = 0;
while (stiva.size() > 0) {
if (componenta[stiva.back()] == -1) {
kosaraju(stiva.back());
nr_comp_conexe++;
}
stiva.pop_back();
}
for (i = 0; i < nr_noduri; i++)
graf[componenta[i]].push_back(i);
printf("%d\n", nr_comp_conexe);
for (i = 0; i < nr_comp_conexe; i++) {
for (j = 0; j < graf[i].size(); j++)
printf("%d ", graf[i][j] + 1);
printf("\n");
}
return 0;
}