Submission #117862

#TimeUsernameProblemLanguageResultExecution timeMemory
117862IOrtroiiiPipes (CEOI15_pipes)C++14
60 / 100
1222 ms23240 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 100100;

int n, m;
vector< tuple<int, int, int> > edges;

struct Dsu {
   int p[N];
   void reset(int n) {
      for (int i = 1; i <= n; ++i) {
         p[i] = i;
      }
   }
   int getp(int u) {
      if (p[u] == u) {
         return u;
      } else {
         return p[u] = getp(p[u]);
      }
   }
   bool mrg(int u, int v) {
      u = getp(u);
      v = getp(v);
      if (u == v) {
         return false;
      } else {
         p[v] = u;
         return true;
      }
   }
} a[2];

vector<pair<int, int>> g[N];
int low[N], num[N], tt;

void dfs(int u, int pid) {
   num[u] = low[u] = ++tt;
   for (auto e : g[u]) {
      int v, id;
      tie(v, id) = e;
      if (id == pid) {
         continue;
      } else if (num[v]) {
         low[u] = min(low[u], num[v]);
      } else {
         dfs(v, id);
         low[u] = min(low[u], low[v]);
         if (low[v] > num[u]) {
            cout << u << ' ' << v << '\n';
         }
      }
   }
}

int main() {
   ios_base::sync_with_stdio(false);

   cin >> n >> m;
   a[0].reset(n);
   a[1].reset(n);
   for (int i = 1; i <= m; ++i) {
      int u, v;
      cin >> u >> v;
      if (a[0].mrg(u, v)) {
         edges.emplace_back(u, v, i);
      } else if (a[1].mrg(u, v)) {
         edges.emplace_back(u, v, i);
      }
   }
   for (auto e : edges) {
      int u, v, id;
      tie(u, v, id) = e;
      g[u].emplace_back(v, id);
      g[v].emplace_back(u, id);
   }
   for (int i = 1; i <= n; ++i) if (!num[i]) {
      dfs(i, -1);
   }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...