Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // main.cpp
- // 2.B
- //
- // Created by Andrey Chulkov on 7/29/15.
- // Copyright (c) 2015 Andrey Chulkov. All rights reserved.
- //
- #include <iostream>
- #include <vector>
- #include <set>
- #define m_p make_pair
- using namespace std;
- typedef pair<int, int> int_pair;
- vector<vector<int>> graph;
- vector<vector<int>> inversed_graph;
- vector<int_pair> edges;
- vector<int> components;
- vector<bool> used;
- vector<int> vertecies;
- int ncomp = 0;
- void dfs(int v) {
- used[v] = true;
- for (auto u : graph[v]) {
- if (!used[u]) {
- dfs(u);
- }
- }
- vertecies.push_back(v);
- }
- void rev_dfs(int v) {
- used[v] = true;
- components[v] = ncomp;
- for (auto u : inversed_graph[v]) {
- if (!used[u]) {
- rev_dfs(u);
- }
- }
- }
- int main() {
- set<int_pair> condensed_edges;
- int n, m;
- cin >> n >> m;
- graph.assign(n, vector<int>());
- inversed_graph.assign(n, vector<int>());
- edges.resize(0);
- components.assign(n, 0);
- used.assign(n, false);
- vertecies.resize(0);
- for (int i = 0; i < m; i++) {
- int b_i, e_i;
- cin >> b_i >> e_i;
- graph[b_i - 1].push_back(e_i - 1);
- inversed_graph[e_i - 1].push_back(b_i - 1);
- edges.push_back(m_p(b_i - 1, e_i - 1));
- }
- for (int v = 0; v < n; v++) {
- if (!used[v]) {
- dfs(v);
- }
- }
- used.assign(n, false);
- for (int v = n - 1; v > -1; v--) {
- if (!used[vertecies[v]]) {
- ncomp += 1;
- rev_dfs(vertecies[v]);
- }
- }
- for (int i = 0; i < m; i++) {
- int u, v;
- u = components[edges[i].first];
- v = components[edges[i].second];
- if (u != v) {
- condensed_edges.insert(m_p(u, v));
- }
- }
- cout << (int) condensed_edges.size() << endl;
- return 0;
- }
Add Comment
Please, Sign In to add comment