QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#655291#7177. Many Many Cyclesno_RED_no_DEADWA 0ms3528kbC++202.5kb2024-10-19 02:32:532024-10-19 02:32:53

Judging History

你现在查看的是最新测评结果

  • [2024-10-19 02:32:53]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3528kb
  • [2024-10-19 02:32:53]
  • 提交

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'