Pagini recente » Cod sursa (job #602848) | Cod sursa (job #1852848) | Cod sursa (job #1042928) | Cod sursa (job #206536) | Cod sursa (job #2681815)
#include <iostream>
#include <vector>
#include <stack>
#include <fstream>
#include <algorithm>
using namespace std;
void dfs(vector<vector<int>>& edges, stack<int>& result, vector<int>& visited, int start = 1, int time = 1) {
visited[start] = time;
for (auto elem : edges[start]) {
if (visited[elem] == 0) {
dfs(edges, result, visited, elem, time);
}
}
result.push(start);
}
void reverseDFS_result(stack<int>& result, vector<int>& visited, vector<vector<int>>& edges) {
for (int i = 0; i < visited.size(); i++) {
if (visited[i] == 0) {
dfs(edges, result, visited, i);
}
}
}
void strongComponents(stack<int>& result, vector<vector<int>>& edges) {
int n = result.size();
int time = 1, visit;
vector<int> visited(n, 0);
for (int i = 0; i < n; i++) {
stack<int> s;
visit = result.top();
result.pop();
if (visited[visit] == 0) {
dfs(edges, s, visited, visit, time);
}
if (!s.empty()) {
time++;
}
}
vector<vector<int>> strongComponents(time);
for (int i = 1; i < visited.size(); i++) {
strongComponents[visited[i]].push_back(i);
}
cout << time - 2 << "\n";
for (int i = 1; i < time; i++) {
for (auto elem : strongComponents[i]) {
cout << elem << " ";
}
cout << "\n";
}
return;
}
int main()
{
ios_base::sync_with_stdio(false);
int n, m, s, x, y;
ifstream in("dfs.in");
ofstream out("dfs.out");
in >> n >> m;
vector<vector<int>> rEdges(n + 1);
vector<vector<int>> edges(n + 1);
for (int i = 0; i < m; i++) {
in >> x >> y;
edges[x].push_back(y);
rEdges[y].push_back(x);
}
stack<int> result;
vector<int> visited(n + 1, 0);
reverseDFS_result(result, visited, rEdges);
/*while (!result.empty()) {
cout << result.top() << " ";
result.pop();
}*/
strongComponents(result, edges);
in.close();
out.close();
return 0;
}