Pagini recente » Cod sursa (job #2158801) | Cod sursa (job #1746488) | Cod sursa (job #842157) | Cod sursa (job #2120266) | Cod sursa (job #3296193)
#include <stdio.h>
#include <vector>
const int MAX_N = 200'000;
FILE *fin, *fout;
std::vector<int> adj[MAX_N];
std::vector<int> adjt[MAX_N];
char vis[MAX_N];
void dfs(int node, std::vector<int> &order) {
vis[node] = 1;
for(int v : adj[node]) {
if(!vis[v]) {
dfs(v, order);
}
}
order.push_back(node);
}
void dfs2(int node, std::vector<int> &component) {
vis[node] = 0;
component.push_back(node);
for(int v : adjt[node]) {
if(vis[v]) {
dfs2(v, component);
}
}
}
int main() {
fin = fopen("ctc.in", "r");
fout = fopen("ctc.out", "w");
int n, m;
fscanf(fin, "%d%d", &n, &m);
for(int i = 0; i < m; i++) {
int u, v;
fscanf(fin, "%d%d", &u, &v);
u--;
v--;
adj[u].push_back(v);
adjt[v].push_back(u);
}
std::vector<int> order;
for(int i = 0; i < n; i++) {
if(!vis[i]) {
dfs(i, order);
}
}
std::vector<std::vector<int>> ctc;
for(int i = n - 1; i >= 0; i--) {
if(vis[order[i]]) {
std::vector<int> component;
dfs2(order[i], component);
ctc.push_back(component);
}
}
fprintf(fout, "%d\n", (int)ctc.size());
for(std::vector<int> &c : ctc) {
for(int x : c) {
fprintf(fout, "%d ", x + 1);
}
fprintf(fout, "\n");
}
fclose(fin);
fclose(fout);
return 0;
}