fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using i64 = long long;
  4.  
  5. void chmin(int &a, int b)
  6. {
  7. if (a > b)
  8. {
  9. a = b;
  10. }
  11. }
  12.  
  13. void chswap(int &a, int &b)
  14. {
  15. int tmp = a;
  16. a = b;
  17. b = tmp;
  18. }
  19.  
  20. const int lim = 1e3 + 5;
  21.  
  22. int n, m, timer, scc;
  23.  
  24. std::vector<int> low(lim), d(lim), sz(lim), ssc(lim), in(lim), out(lim), visited(lim);
  25. std::vector<std::vector<int>> adj(lim), node(lim);
  26. std::vector<std::vector<std::array<int, 2>>> adj1(lim);
  27. std::stack<int> st;
  28. bool done[lim];
  29.  
  30. void tarjan(int u)
  31. {
  32. low[u] = d[u] = ++timer;
  33.  
  34. st.push(u);
  35.  
  36. for (int v : adj[u])
  37. {
  38. if (done[v] == false)
  39. {
  40. if (d[v])
  41. {
  42. chmin(low[u], d[v]);
  43. }
  44. else
  45. {
  46. tarjan(v);
  47.  
  48. chmin(low[u], low[v]);
  49. }
  50. }
  51. }
  52.  
  53. if (low[u] == d[u])
  54. {
  55. int v;
  56. ++scc;
  57. do
  58. {
  59. v = st.top();
  60. st.pop();
  61.  
  62. done[v] = true;
  63.  
  64. ssc[v] = scc;
  65. ++sz[scc];
  66.  
  67. node[ssc[v]].push_back(v);
  68. } while (v != u);
  69. }
  70. }
  71.  
  72. int remove_id;
  73.  
  74. /*
  75. visited:
  76. 1 - is visiting
  77. 2 - visited
  78. 3 - is not visit
  79. */
  80.  
  81. bool isCycle(int u)
  82. {
  83. visited[u] = 1;
  84.  
  85. for (std::array<int, 2> &cur : adj1[u]) if (cur[1] != remove_id)
  86. {
  87. int v = cur[0];
  88.  
  89. if (visited[v] == 1) return true;
  90.  
  91. if (visited[v] == 0)
  92. {
  93. if (isCycle(v))
  94. {
  95. return true;
  96. }
  97. }
  98. }
  99.  
  100. visited[u] = 2;
  101.  
  102. return false;
  103. }
  104.  
  105. bool will_this_DAG_is_cycle_if_we_remove_edge(int u, int v, int id)
  106. {
  107. remove_id = id;
  108. if (ssc[u] == ssc[v])
  109. {
  110. for (int i : node[ssc[u]]) visited[i] = 0;
  111.  
  112. for (int i : node[ssc[u]])
  113. {
  114. if (visited[i] == 0)
  115. {
  116. if (isCycle(i)) return false;
  117. }
  118. }
  119. }
  120.  
  121. return true;
  122. }
  123.  
  124. int main()
  125. {
  126. std::ios_base::sync_with_stdio(false);
  127. std::cin.tie(nullptr);
  128.  
  129. std::cin >> n >> m;
  130.  
  131. std::vector<std::array<int, 2>> edges(m), conditional_edges, ans;
  132.  
  133. for (int i = 0; i < m; ++i)
  134. {
  135. int u, v;
  136. std::cin >> u >> v;
  137.  
  138. adj[u].push_back(v);
  139.  
  140. edges[i] = {u, v};
  141. }
  142.  
  143. for (int i = 1; i <= n; ++i)
  144. if (!d[i])
  145. tarjan(i);
  146.  
  147. std::cerr << scc << "\n";
  148.  
  149. bool has_cycle = false;
  150. int cycle = 0;
  151. int strong_components_have_one_cycle = 0;
  152.  
  153. for (int i = 1; i <= scc; ++i)
  154. {
  155. has_cycle = false;
  156.  
  157. if (sz[i] > 1) has_cycle = true;
  158. else
  159. {
  160. for (int _i = 0; _i < m; ++_i)
  161. {
  162. int u = edges[_i][0];
  163. int v = edges[_i][1];
  164. if (u == v and ssc[u] == i and ssc[v] == i)
  165. {
  166. has_cycle = true;
  167. break;
  168. }
  169. }
  170. }
  171.  
  172. if (has_cycle)
  173. {
  174. ++cycle;
  175. strong_components_have_one_cycle = i;
  176. }
  177. }
  178.  
  179. if (cycle != 1)
  180. {
  181. std::cout << -1 << "\n";
  182. return 0;
  183. }
  184.  
  185. for (int i = 0; i < m; ++i)
  186. {
  187. int u = edges[i][0];
  188. int v = edges[i][1];
  189.  
  190. if (ssc[u] == strong_components_have_one_cycle and ssc[v] == strong_components_have_one_cycle)
  191. {
  192. ++out[u], ++in[v];
  193.  
  194. adj1[u].push_back({v, i});
  195. conditional_edges.push_back({u, v});
  196. }
  197. }
  198.  
  199. // std::cout << strong_components_have_one_cycle << "\n";
  200.  
  201. // std::cout << (int)conditional_edges.size() << "\n";
  202.  
  203. bool is_simpleCycle = true;
  204.  
  205. for (int i = 1; i <= n; ++i)
  206. {
  207. if (ssc[i] == strong_components_have_one_cycle)
  208. {
  209. if (in[i] != 1 || out[i] != 1)
  210. {
  211. is_simpleCycle = false;
  212. }
  213. }
  214. }
  215.  
  216. if (is_simpleCycle)
  217. {
  218. std::cerr << "is simple cycle\n";
  219. ans = conditional_edges;
  220. }
  221. else
  222. {
  223. std::cerr << "is not simple cycle\n";
  224. for (int i = 0; i < m; ++i)
  225. {
  226. int u = edges[i][0];
  227. int v = edges[i][1];
  228.  
  229. if (ssc[u] == strong_components_have_one_cycle and ssc[v] == strong_components_have_one_cycle)
  230. {
  231. if (will_this_DAG_is_cycle_if_we_remove_edge(u, v, i))
  232. {
  233. ans.push_back({u, v});
  234. }
  235. }
  236. }
  237. }
  238.  
  239. std::sort(ans.begin(), ans.end());
  240. ans.erase(std::unique(ans.begin(), ans.end()), ans.end());
  241.  
  242. std::cout << (int)ans.size() << "\n";
  243.  
  244. for (std::array<int, 2> &edge : ans)
  245. {
  246. int u = edge[0];
  247. int v = edge[1];
  248.  
  249. std::cout << u << ' ' << v << "\n";
  250. }
  251.  
  252. return 0;
  253.  
  254. }
  255.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
Main.java:1: error: illegal character: '#'
#include <bits/stdc++.h>
^
Main.java:1: error: class, interface, or enum expected
#include <bits/stdc++.h>
         ^
Main.java:5: error: class, interface, or enum expected
void chmin(int &a, int b)
^
Main.java:10: error: class, interface, or enum expected
    }
    ^
Main.java:16: error: class, interface, or enum expected
    a = b;
    ^
Main.java:17: error: class, interface, or enum expected
    b = tmp;
    ^
Main.java:18: error: class, interface, or enum expected
}
^
Main.java:22: error: class, interface, or enum expected
int n, m, timer, scc;
^
Main.java:24: error: class, interface, or enum expected
std::vector<int> low(lim), d(lim), sz(lim), ssc(lim), in(lim), out(lim), visited(lim);
^
Main.java:25: error: class, interface, or enum expected
std::vector<std::vector<int>> adj(lim), node(lim);
^
Main.java:26: error: class, interface, or enum expected
std::vector<std::vector<std::array<int, 2>>> adj1(lim);
^
Main.java:27: error: class, interface, or enum expected
std::stack<int> st;
^
Main.java:28: error: class, interface, or enum expected
bool done[lim];
^
Main.java:30: error: class, interface, or enum expected
void tarjan(int u)
^
Main.java:34: error: class, interface, or enum expected
    st.push(u);
    ^
Main.java:36: error: class, interface, or enum expected
    for (int v : adj[u])
    ^
Main.java:43: error: class, interface, or enum expected
            }
            ^
Main.java:48: error: class, interface, or enum expected
                chmin(low[u], low[v]);
                ^
Main.java:49: error: class, interface, or enum expected
            }
            ^
Main.java:56: error: class, interface, or enum expected
        ++scc;
        ^
Main.java:57: error: class, interface, or enum expected
        do
        ^
Main.java:60: error: class, interface, or enum expected
            st.pop();
            ^
Main.java:62: error: class, interface, or enum expected
            done[v] = true;
            ^
Main.java:64: error: class, interface, or enum expected
            ssc[v] = scc;
            ^
Main.java:65: error: class, interface, or enum expected
            ++sz[scc];
            ^
Main.java:67: error: class, interface, or enum expected
            node[ssc[v]].push_back(v);
            ^
Main.java:68: error: class, interface, or enum expected
        } while (v != u);
        ^
Main.java:69: error: class, interface, or enum expected
    }
    ^
Main.java:81: error: class, interface, or enum expected
bool isCycle(int u)
^
Main.java:85: error: class, interface, or enum expected
    for (std::array<int, 2> &cur : adj1[u]) if (cur[1] != remove_id)
    ^
Main.java:89: error: class, interface, or enum expected
        if (visited[v] == 1) return true;
        ^
Main.java:91: error: class, interface, or enum expected
        if (visited[v] == 0)
        ^
Main.java:96: error: class, interface, or enum expected
            }
            ^
Main.java:102: error: class, interface, or enum expected
    return false;
    ^
Main.java:103: error: class, interface, or enum expected
}
^
Main.java:108: error: class, interface, or enum expected
    if (ssc[u] == ssc[v])
    ^
Main.java:112: error: class, interface, or enum expected
        for (int i : node[ssc[u]])
        ^
Main.java:117: error: class, interface, or enum expected
            }
            ^
Main.java:122: error: class, interface, or enum expected
}
^
Main.java:127: error: class, interface, or enum expected
    std::cin.tie(nullptr);
    ^
Main.java:129: error: class, interface, or enum expected
    std::cin >> n >> m;
    ^
Main.java:131: error: class, interface, or enum expected
    std::vector<std::array<int, 2>> edges(m), conditional_edges, ans;
    ^
Main.java:133: error: class, interface, or enum expected
    for (int i = 0; i < m; ++i)
    ^
Main.java:133: error: class, interface, or enum expected
    for (int i = 0; i < m; ++i)
                    ^
Main.java:133: error: class, interface, or enum expected
    for (int i = 0; i < m; ++i)
                           ^
Main.java:136: error: class, interface, or enum expected
        std::cin >> u >> v;
        ^
Main.java:138: error: class, interface, or enum expected
        adj[u].push_back(v);
        ^
Main.java:140: error: class, interface, or enum expected
        edges[i] = {u, v};
        ^
Main.java:141: error: class, interface, or enum expected
    }
    ^
Main.java:143: error: class, interface, or enum expected
    for (int i = 1; i <= n; ++i)
                    ^
Main.java:143: error: class, interface, or enum expected
    for (int i = 1; i <= n; ++i)
                            ^
Main.java:147: error: class, interface, or enum expected
    std::cerr << scc << "\n";
    ^
Main.java:149: error: class, interface, or enum expected
    bool has_cycle = false;
    ^
Main.java:150: error: class, interface, or enum expected
    int cycle = 0;
    ^
Main.java:151: error: class, interface, or enum expected
    int strong_components_have_one_cycle = 0;
    ^
Main.java:153: error: class, interface, or enum expected
    for (int i = 1; i <= scc; ++i)
    ^
Main.java:153: error: class, interface, or enum expected
    for (int i = 1; i <= scc; ++i)
                    ^
Main.java:153: error: class, interface, or enum expected
    for (int i = 1; i <= scc; ++i)
                              ^
Main.java:157: error: class, interface, or enum expected
        if (sz[i] > 1) has_cycle = true;
        ^
Main.java:158: error: class, interface, or enum expected
        else
        ^
Main.java:160: error: class, interface, or enum expected
            for (int _i = 0; _i < m; ++_i)
                             ^
Main.java:160: error: class, interface, or enum expected
            for (int _i = 0; _i < m; ++_i)
                                     ^
Main.java:163: error: class, interface, or enum expected
                int v = edges[_i][1];
                ^
Main.java:164: error: class, interface, or enum expected
                if (u == v and ssc[u] == i and ssc[v] == i)
                ^
Main.java:167: error: class, interface, or enum expected
                    break;
                    ^
Main.java:168: error: class, interface, or enum expected
                }
                ^
Main.java:175: error: class, interface, or enum expected
            strong_components_have_one_cycle = i;
            ^
Main.java:176: error: class, interface, or enum expected
        }
        ^
Main.java:182: error: class, interface, or enum expected
        return 0;
        ^
Main.java:183: error: class, interface, or enum expected
    }
    ^
Main.java:185: error: class, interface, or enum expected
    for (int i = 0; i < m; ++i)
                    ^
Main.java:185: error: class, interface, or enum expected
    for (int i = 0; i < m; ++i)
                           ^
Main.java:188: error: class, interface, or enum expected
        int v = edges[i][1];
        ^
Main.java:190: error: class, interface, or enum expected
        if (ssc[u] == strong_components_have_one_cycle and ssc[v] == strong_components_have_one_cycle)
        ^
Main.java:194: error: class, interface, or enum expected
            adj1[u].push_back({v, i});
            ^
Main.java:195: error: class, interface, or enum expected
            conditional_edges.push_back({u, v});
            ^
Main.java:196: error: class, interface, or enum expected
        }
        ^
Main.java:205: error: class, interface, or enum expected
    for (int i = 1; i <= n; ++i)
    ^
Main.java:205: error: class, interface, or enum expected
    for (int i = 1; i <= n; ++i)
                    ^
Main.java:205: error: class, interface, or enum expected
    for (int i = 1; i <= n; ++i)
                            ^
Main.java:212: error: class, interface, or enum expected
            }
            ^
Main.java:219: error: class, interface, or enum expected
        ans = conditional_edges;
        ^
Main.java:220: error: class, interface, or enum expected
    }
    ^
Main.java:224: error: class, interface, or enum expected
        for (int i = 0; i < m; ++i)
        ^
Main.java:224: error: class, interface, or enum expected
        for (int i = 0; i < m; ++i)
                        ^
Main.java:224: error: class, interface, or enum expected
        for (int i = 0; i < m; ++i)
                               ^
Main.java:227: error: class, interface, or enum expected
            int v = edges[i][1];
            ^
Main.java:229: error: class, interface, or enum expected
            if (ssc[u] == strong_components_have_one_cycle and ssc[v] == strong_components_have_one_cycle)
            ^
Main.java:234: error: class, interface, or enum expected
                }
                ^
Main.java:240: error: class, interface, or enum expected
    ans.erase(std::unique(ans.begin(), ans.end()), ans.end());
    ^
Main.java:242: error: class, interface, or enum expected
    std::cout << (int)ans.size() << "\n";
    ^
Main.java:244: error: class, interface, or enum expected
    for (std::array<int, 2> &edge : ans)
    ^
Main.java:247: error: class, interface, or enum expected
        int v = edge[1];
        ^
Main.java:249: error: class, interface, or enum expected
        std::cout << u << ' ' << v << "\n";
        ^
Main.java:250: error: class, interface, or enum expected
    }
    ^
Main.java:254: error: class, interface, or enum expected
}
^
96 errors
stdout
Standard output is empty