Pagini recente » Cod sursa (job #713946) | Cod sursa (job #1871760) | Cod sursa (job #1357924) | Cod sursa (job #2816574) | Cod sursa (job #2928866)
#include <fstream>
#include <vector>
#include <unordered_map>
#include <stack>
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
int nr_ctc, index = 1;
stack<int> stiva;
unordered_map<int, vector<int>> ctc, adj_list;
vector<int> low_link;
vector<bool> on_stack;
vector<int> id;
void dfs(int node) {
stiva.push(node);
id[node] = index;
low_link[node] = index;
on_stack[node] = true;
index++;
for (auto neighbor: adj_list[node]) {
if (!id[neighbor])
dfs(neighbor);
if (on_stack[neighbor])
low_link[node] = min(low_link[node], low_link[neighbor]);
}
if (id[node] == low_link[node]) {
while (!stiva.empty()) {
int head = stiva.top();
on_stack[head] = false;
low_link[head] = node;
ctc[nr_ctc].push_back(head);
stiva.pop();
if (head == node)
break;
}
nr_ctc++;
}
}
int main() {
int v1, v2;
int num_nodes, num_edges;
fin >> num_nodes >> num_edges;
low_link.resize(num_nodes + 1, 0);
on_stack.resize(num_nodes + 1, false);
id.resize(num_nodes + 1, 0);
for (int i = 0; i < num_edges; i++) {
fin >> v1 >> v2;
adj_list[v1].push_back(v2);
}
for (int i = 1; i <= num_nodes; i++) {
if (!id[i])
dfs(i);
}
for (auto &it: ctc) {
for (auto &componenta: it.second) {
fout << componenta << " ";
}
fout << "\n";
}
return 0;
}