QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#655291 | #7177. Many Many Cycles | no_RED_no_DEAD | WA | 0ms | 3528kb | C++20 | 2.5kb | 2024-10-19 02:32:53 | 2024-10-19 02:32:53 |
Judging History
answer
#include <bits/stdc++.h>
using i64 = long long;
using u64 = unsigned long long;
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
// Input: nothing
int n, m;
std::cin >> n >> m;
// Input: nothing
i64 ans = 0;
std::vector<int> u(m), v(m), w(m);
std::vector<std::vector<std::array<int, 3>>> adj(n);
for (int i = 0; i < m; i++) {
std::cin >> u[i] >> v[i] >> w[i];
u[i]--, v[i]--;
adj[u[i]].push_back({v[i], w[i], i});
adj[v[i]].push_back({u[i], w[i], i});
}
std::mt19937 rng;
std::vector<int> parent(n, -1), pe(n);
std::vector<bool> vis(n);
std::vector<i64> dep(n);
std::vector<u64> vh(n), eh(m);
auto dfs = [&](auto self, int x) -> void {
vis[x] = true;
// Step 1: Duyệt các nút liên thông
for (auto [y, w, i] : adj[x]) {
// Step 2: Gặp cha thì kệ mịa nó
if (y == parent[x]) {
continue;
}
// Step 3: Nếu nút y chưa được duyệt => chưa tạo thành cycle
if (!vis[y]) {
// Bước 1: Không cho thằng tiếp theo đi ngược về
parent[y] = x;
// Bước 2: Cập nhật khoảng cách trong cây :D
dep[y] = dep[x] + w;
// Bước 3: Nút y được đi tới từ cạnh i
pe[y] = i;
// Bước 4: Đi tiếp chứ sợ gì
self(self, y);
// Bước 5: ???
vh[x] ^= vh[y];
}
// Step 4: Chỉ nhận là cycle khi khoảng cách từ y đến root <
else {
u64 u = rng();
vh[x] ^= u;
vh[y] ^= u;
eh[i] ^= u;
ans = std::gcd(ans, dep[x] - dep[y] + w);
}
}
};
// B1: Dfs trong từng thành phần liên thông
for (int i = 0; i < n; i++) {
if (!vis[i]) {
dfs(dfs, i);
}
}
for (int i = 0; i < n; i++) {
if (parent[i] != -1) {
eh[pe[i]] ^= vh[i];
}
}
std::map<u64, i64> sum;
for (int i = 0; i < m; i++) {
if (eh[i]) {
sum[eh[i]] += w[i];
}
}
for (auto [_, s] : sum) {
ans = std::gcd(ans, 2 * s);
}
std::cout << ans << "\n";
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 0ms
memory: 3528kb
input:
4 4 1 2 1 2 3 1 3 4 1 4 1 1
output:
2
result:
wrong answer expected '4', found '2'