제출 #1345748

#제출 시각아이디문제언어결과실행 시간메모리
1345748killerzaluuDuathlon (APIO18_duathlon)C++20
0 / 100
1095 ms12356 KiB
#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m;
    cin >> n >> m;

    vector<vector<int>> g(n + 1);
    for (int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }

    vector<int> vis(n + 1, 0), incomp(n + 1, 0), banned(n + 1, 0);
    long long ans = 0;

    for (int st = 1; st <= n; st++) {
        if (vis[st]) continue;

        vector<int> comp;
        queue<int> q;
        q.push(st);
        vis[st] = 1;

        while (!q.empty()) {
            int u = q.front();
            q.pop();
            comp.push_back(u);
            incomp[u] = 1;

            for (int v : g[u]) {
                if (!vis[v]) {
                    vis[v] = 1;
                    q.push(v);
                }
            }
        }

        int s = (int)comp.size();
        if (s < 3) {
            for (int x : comp) incomp[x] = 0;
            continue;
        }

        for (int ban : comp) {
            banned[ban] = 1;

            long long sumsq = 0;
            unordered_set<int> seen;
            queue<int> qq;

            for (int x : comp) {
                if (x == ban) continue;
                if (seen.count(x)) continue;

                int cnt = 0;
                qq.push(x);
                seen.insert(x);

                while (!qq.empty()) {
                    int u = qq.front();
                    qq.pop();
                    cnt++;

                    for (int v : g[u]) {
                        if (!incomp[v] || banned[v]) continue;
                        if (seen.count(v)) continue;
                        seen.insert(v);
                        qq.push(v);
                    }
                }

                sumsq += 1LL * cnt * cnt;
            }

            long long A = 1LL * (s - 1) * (s - 1) - sumsq;
            ans += 1LL * s * (s - 1) * (s - 2) - A;

            banned[ban] = 0;
        }

        for (int x : comp) incomp[x] = 0;
    }

    cout << ans << '\n';
    return 0;
}
#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...