fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int MAXN = 105;
  5. vector<int> adj[MAXN]; // Danh sách k?
  6. bool visited[MAXN];
  7. int parent[MAXN]; // Luu d?nh cha trong DFS
  8. vector<pair<int, int>> directedEdges; // Danh sách c?nh có hu?ng
  9. int n, m, t;
  10.  
  11. // DFS ki?m tra liên thông m?nh
  12. void dfs(int u) {
  13. visited[u] = true;
  14. for (int v : adj[u]) {
  15. if (!visited[v]) dfs(v);
  16. }
  17. }
  18.  
  19. // Ki?m tra d? th? có d?nh chi?u du?c không
  20. bool isStronglyOrientable() {
  21. // Ki?m tra liên thông
  22. fill(visited, visited + n + 1, false);
  23. dfs(1);
  24. if (count(visited + 1, visited + n + 1, true) != n) return false;
  25.  
  26. // Ki?m tra liên thông trên d? th? ngu?c
  27. vector<int> reverseAdj[MAXN];
  28. for (int u = 1; u <= n; u++) {
  29. for (int v : adj[u]) {
  30. reverseAdj[v].push_back(u);
  31. }
  32. }
  33. fill(visited, visited + n + 1, false);
  34. swap(adj, reverseAdj);
  35. dfs(1);
  36. swap(adj, reverseAdj);
  37. return count(visited + 1, visited + n + 1, true) == n;
  38. }
  39.  
  40. // Ð?nh chi?u d? th? s? d?ng DFS
  41. void orientGraph(int u) {
  42. visited[u] = true;
  43. for (int v : adj[u]) {
  44. if (!visited[v]) {
  45. parent[v] = u;
  46. directedEdges.emplace_back(u, v);
  47. orientGraph(v);
  48. } else if (parent[u] != v) {
  49. directedEdges.emplace_back(u, v); // Ch?n hu?ng còn l?i
  50. }
  51. }
  52. }
  53.  
  54. int main() {
  55. cin >> t >> n >> m;
  56. vector<pair<int, int>> edges(m);
  57. for (int i = 0; i < m; i++) {
  58. int u, v;
  59. cin >> u >> v;
  60. adj[u].push_back(v);
  61. adj[v].push_back(u);
  62. edges[i] = {u, v};
  63. }
  64.  
  65. if (t == 1) {
  66. cout << (isStronglyOrientable() ? 1 : 0) << endl;
  67. } else if (t == 2) {
  68. fill(visited, visited + n + 1, false);
  69. fill(parent, parent + n + 1, -1);
  70. orientGraph(1);
  71. sort(directedEdges.begin(), directedEdges.end());
  72.  
  73. cout << n << " " << m << endl;
  74. for (auto [u, v] : directedEdges) {
  75. cout << u << " " << v << endl;
  76. }
  77. }
  78.  
  79. return 0;
  80. }
  81.  
Success #stdin #stdout 0.01s 5284KB
stdin
2
4 5
1 2
1 3
1 4
2 4
3 4
stdout
4 5
1 2
1 3
1 4
2 4
3 1
4 1
4 3