Pagini recente » Cod sursa (job #395838) | Cod sursa (job #155803) | Cod sursa (job #1174226) | Cod sursa (job #1747268) | Cod sursa (job #1425145)
/* Tarjan */
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>
#define MAXN 100001
#define undefined -1
using namespace std;
using Graph = vector<vector<int> >;
Graph G(MAXN);
vector<int> index(MAXN, undefined);
vector<int> lowlink(MAXN);
vector<bool> onstack(MAXN);
int N, M;
void tarjan(int source,
int& current_idx,
stack<int>& st,
vector<vector<int> > &stronglyCtc)
{
index[source] = lowlink[source] = current_idx;
current_idx += 1;
st.emplace(source);
onstack[source] = true;
for (auto &node : G[source])
if (index[node] == undefined) {
tarjan(node, current_idx, st, stronglyCtc);
lowlink[source] = min(lowlink[source], lowlink[node]);
} else if (onstack[node])
lowlink[source] = min(lowlink[source], index[node]);
if (lowlink[source] == index[source]) {
vector<int> comp;
int node;
do {
node = st.top();
st.pop();
comp.emplace_back(node);
onstack[node] = false;
} while (!st.empty() && node != source);
stronglyCtc.emplace_back(comp);
}
}
int main()
{
ifstream in("ctc.in");
ofstream out("ctc.out");
in >> N >> M;
for (int i = 1; i <= M; i++) {
int x, y;
in >> x >> y;
G[x].push_back(y);
}
vector<vector<int> > stronglyCtc;
int start_idx = 1;
stack<int> st;
for (int node = 1; node <= N; node++)
if (index[node] == undefined)
tarjan(node, start_idx, st, stronglyCtc);
int ctc_number = stronglyCtc.size();
out << ctc_number<< '\n';
for (int i = 0; i < ctc_number; i++) {
for (auto &node : stronglyCtc[i])
out << node << " ";
out << '\n';
}
return 0;
}