제출 #406081

#제출 시각아이디문제언어결과실행 시간메모리
406081tengiz05자매 도시 (APIO20_swap)C++17
17 / 100
2082 ms18676 KiB
#include "swap.h" #include <bits/stdc++.h> constexpr int N = 1e5; std::set<int> e[N]; std::vector<int> U, V, W; int n, m; void init(int n, int m, std::vector<int> U, std::vector<int> V, std::vector<int> W) { ::U = U; ::V = V; ::W = W; ::n = n; ::m = m; } std::vector<int> p; std::vector<bool> vis; bool have; void dfs(int u, int P) { p[u] = P; vis[u] = true; if (e[u].size() > 2) have = true; for (auto v : e[u]) { if (!vis[v]) { dfs(v, u); } } } bool check(int X, int Y, int mid) { for (int i = 0; i < n; i++) e[i].clear(); for (int i = 0; i < m; i++) { if (W[i] <= mid) { e[U[i]].emplace(V[i]); e[V[i]].emplace(U[i]); } } p.assign(n, -1); vis.assign(n, false); have = false; dfs(X, -1); if (p[Y] == -1) return false; if (have) { return true; } int y = Y; std::vector<int> got; y = p[y]; while (y != -1 && p[y] != -1) { got.push_back(y); y = p[y]; } for (auto x : got) { if (e[x].size() > 2) { return true; } } if (e[X].size() > 2 || e[Y].size() > 2) { return true; } y = Y; for (auto x : got) { e[x].erase(y); e[y].erase(x); y = x; } e[X].erase(y); e[y].erase(X); p.assign(n, -1); vis.assign(n, false); dfs(X, -1); if (p[Y] != -1) return true; return false; } int getMinimumFuelCapacity(int X, int Y) { int l = -1, r = 1e9 + 2; while (l + 1 < r) { int mid = (l + r) / 2; if (check(X, Y, mid)) { r = mid; } else { l = mid; } } if (r == 1e9 + 2) r = -1; return r; }
#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...