Submission #81980

#TimeUsernameProblemLanguageResultExecution timeMemory
81980SaboonPipes (CEOI15_pipes)C++14
40 / 100
738 ms1172 KiB
#include <bits/stdc++.h> #define F first #define S second #define PB push_back #define PF push_front #define MP make_pair using namespace std; typedef long long ll; typedef long double ld; typedef pair<int,int> pii; const int maxn = 1e4 + 10; const int block = 320; int h[maxn], par[maxn], parsqrt[maxn], dp[maxn]; bool cut[maxn]; int lca (int v, int u) { if (h[v] < h[u]) swap (v, u); while (h[v] > h[u]) { if (h[v] - block >= h[u]) v = parsqrt[v]; else v = par[v]; } if (v == u) return v; while (v != u) { if (parsqrt[v] != parsqrt[u]) { v = parsqrt[v]; u = parsqrt[u]; } else { v = par[v]; u = par[u]; } } return v; } vector <int> g[maxn]; void dfs2 (int v, int p) { dp[v] = h[v]; for (auto w : g[v]) { if (w != p) { h[w] = h[v] + 1; dfs2 (w, v); } } } void dfs1 (int v, int p) { par[v] = p; parsqrt[v] = p; for (int i = 1; i < block; i++) parsqrt[v] = par[parsqrt[v]]; for (auto u : g[v]) { if (u != p) { dfs1 (u, v); if (h[v] > h[u]) cut[u] = cut[v]; } } } void dfs (int v, int p = -1) { for (auto w : g[v]) { if (w != p) { dfs (w, v); dp[v] = min (dp[v], dp[w]); } } cut[v] &= (h[v] <= dp[v]); } int dpar[maxn]; int get_par (int v) { if (dpar[v] < 0) return v; return dpar[v] = get_par (dpar[v]); } int n; void merge (int v, int u) { int vpar = get_par (v), upar = get_par (u); dfs (vpar); dfs1 (v, u); cut[v] = 1; h[v] = h[u] + 1; dfs2 (v, u); dpar[upar] += dpar[vpar]; dpar[vpar] = upar; g[u].PB (v); g[v].PB (u); } int main() { memset (par, -1, sizeof par); memset (dpar, -1, sizeof dpar); int m; cin >> n >> m; while (m --) { int v, u; cin >> v >> u; int vpar = get_par(v), upar = get_par(u); if (vpar != upar) { if (dpar[vpar] < dpar[upar]) swap (v, u); merge (v, u); } else { int w = lca (v, u); dp[v] = min (dp[v], h[w]); dp[u] = min (dp[u], h[w]); } } for (int i = 1; i <= n; i++) if (dpar[i] < 0) dfs (i); for (int i = 1; i <= n; i++) if (cut[i]) cout << i << " " << par[i] << endl; }
#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...