Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <array>
- #include <cassert>
- #include <climits>
- #include <cmath>
- #include <cstring>
- #include <iomanip>
- #include <iostream>
- #include <limits>
- #include <list>
- #include <map>
- #include <numeric>
- #include <queue>
- #include <set>
- #include <sstream>
- #include <stack>
- #include <string>
- #include <tuple>
- #include <unordered_map>
- #include <unordered_set>
- #include <vector>
- #define all(x) x.begin(), x.end()
- using namespace std;
- using ll=long long;
- const double eps = 1e-10;
- const int mod = 1000000007;
- void DFS(const vector<vector<int>>& g, int u, vector<bool>& used, vector<int>& to_go) {
- used[u] = true;
- for (int v : g[u]) {
- if (!used[v]) {
- DFS(g, v, used, to_go);
- }
- }
- to_go.push_back(u);
- }
- vector<int> DFSGo(const vector<vector<int>>& h) {
- int n = h.size();
- vector<bool> used(n);
- vector<int> to_go(n);
- for (int u = 0; u < n; ++u) {
- if (!used[u]) {
- DFS(h, u, used, to_go);
- }
- }
- return to_go;
- }
- void DFSKss(const vector<vector<int>>& g, int u, vector<int>& kss, int comp) {
- kss[u] = comp;
- for (int v : g[u]) {
- if (kss[v] == -1) {
- DFSKss(g, v, kss, comp);
- }
- }
- }
- vector<set<int>> Condense(const vector<vector<int>>& g) {
- int n = g.size();
- vector<vector<int>> h(n);
- for (int u = 0; u < n; ++u) {
- for (int v : g[u]) h[v].push_back(u);
- }
- vector<int> to_go = DFSGo(h);
- reverse(all(to_go));
- vector<int> kss(n, -1);
- int comp = 0;
- for (int u : to_go) {
- if (kss[u] == -1) {
- DFSKss(g, u, kss, comp++);
- }
- }
- vector<set<int>> condensed(comp);
- for (int u = 0; u < n; ++u) {
- for (int v : g[u]) {
- if (kss[u] == kss[v]) continue;
- condensed[kss[u]].insert(kss[v]);
- }
- }
- return condensed;
- }
- void Solve() {
- int n, e; cin >> n >> e;
- vector<vector<int>> g(n);
- for (int i = 0; i < e; ++i) {
- int u, v; cin >> u >> v;
- g[u].push_back(v);
- }
- auto condense = Condense(g);
- for (int u = 0; u < condense.size(); ++u) {
- cout << u << ": ";
- for (int v : condense[u]) cout << v << " ";
- cout << "\n";
- }
- }
- int main() {
- ios::sync_with_stdio(false);
- cin.tie(nullptr);
- cout.tie(nullptr);
- Solve();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment