Submission #751900

#TimeUsernameProblemLanguageResultExecution timeMemory
751900stevancvLogičari (COCI21_logicari)C++14
110 / 110
134 ms18284 KiB
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define sp ' '
#define en '\n'
#define smin(a, b) a = min(a, b)
#define smax(a, b) a = max(a, b)
using namespace std;
const int N = 1e5 + 2;
const int inf = 2e9;
struct Dsu {
    int p[N];
    void Init(int n) {
        for (int i = 1; i <= n; i++) p[i] = i;
    }
    int Find(int x) {
        if (x == p[x]) return x;
        return p[x] = Find(p[x]);
    }
    void Unite(int u, int v) {
        u = Find(u); v = Find(v);
        p[v] = u;
    }
}dsu;
vector<int> g[N];
int sta[N], col[N];
int dp[N][2][2];
int Resi(int s, int e) {
    if (sta[s] == 0) {
        dp[s][col[s]][0] = col[s];
        int mx = 0;
        for (int u : g[s]) {
            if (u == e) continue;
            Resi(u, s);
            smax(mx, dp[u][0][col[s]]);
            dp[s][col[s]][0] += dp[u][0][col[s]];
        }
        if (mx == inf) dp[s][col[s]][0] = mx;
        return dp[s][col[s]][0];
    }
    for (int u : g[s]) if (u != e) Resi(u, s);
    for (int j = 0; j < 2; j++) {
        if (col[s] < 2 && col[s] != j) continue;
        dp[s][j][0] = dp[s][j][1] = j;
        int sum = 0;
        int mx = 0;
        int cnt = 0;
        for (int u : g[s]) {
            if (u == e) continue;
            if (dp[u][0][j] == inf) {mx = u; cnt += 1;}
            if (mx != u) sum += dp[u][0][j];
            if (mx != u)dp[s][j][0] += dp[u][0][j];
            if (mx != u)dp[s][j][1] += dp[u][0][j];
        }
        if (cnt >= 2) {
            dp[s][j][0] = dp[s][j][1] = inf;
            continue;
        }
        if (cnt == 1) {
            dp[s][j][1] = inf;
            if (dp[mx][1][j] != inf) dp[s][j][0] += dp[mx][1][j];
            else dp[s][j][0] = inf;
            continue;
        }
        mx = -inf;
        for (int u : g[s]) {
            if (u == e) continue;
            if (dp[u][1][j] != inf) smax(mx, dp[u][0][j] - dp[u][1][j]);
        }
        if (mx == -inf) dp[s][j][0] = inf;
        else dp[s][j][0] -= mx;
    }
    return min({dp[s][0][0], dp[s][1][0]});
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n; cin >> n;
    dsu.Init(n);
    int A, B; A = B = 0;
    for (int i = 0; i < n; i++) {
        int u, v;
        cin >> u >> v;
        if (dsu.Find(u) != dsu.Find(v)) {
            dsu.Unite(u, v);
            g[u].push_back(v);
            g[v].push_back(u);
        }
        else {
            A = u;
            B = v;
        }
    }
    for (int i = 1; i <= n; i++) {
        sta[i] = 1; col[i] = 2;
    }
    for (int i = 1; i <= n; i++) for (int j = 0; j < 4; j++) dp[i][j / 2][j % 2] = inf;
    col[A] = col[B] = 0;
    int ans = Resi(1, 0);
    for (int i = 1; i <= n; i++) for (int j = 0; j < 4; j++) dp[i][j / 2][j % 2] = inf;
    col[B] = 1; sta[A] = 0;
    smin(ans, Resi(1, 0));
    for (int i = 1; i <= n; i++) for (int j = 0; j < 4; j++) dp[i][j / 2][j % 2] = inf;
    col[A] = 1; sta[B] = 0;
    smin(ans, Resi(1, 0));
    for (int i = 1; i <= n; i++) for (int j = 0; j < 4; j++) dp[i][j / 2][j % 2] = inf;
    col[B] = 0; sta[A] = 1;
    smin(ans, Resi(1, 0));
    if (ans == inf) ans = -1;
    cout << ans << en;
    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...