제출 #1333909

#제출 시각아이디문제언어결과실행 시간메모리
1333909reverberatedevLogičari (COCI21_logicari)C++20
10 / 110
133 ms32520 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define double long double

const int MAXN = 1e5 + 5;
const int INF = 1e18;

int n, root, special;
int head[MAXN], par[MAXN], memo[MAXN][2][2][2][2];
vector<int> adj[MAXN];

int find(int u){
    if(u == head[u]) return u;
    return head[u] = find(head[u]);
}

void dfs(int u, int p){
    par[u] = p;
    for(int v : adj[u]){
        if(v == p) continue;
        dfs(v, u);
    }
}

int dp(int x, int me, int up, int rt, int sp){
    if(memo[x][me][up][rt][sp] != -1) return memo[x][me][up][rt][sp];

    bool ok = 1;
    if(x == root && me != rt) ok = 0;
    if(x == special && me != sp) ok = 0;
    if(x == special && rt && up) ok = 0;
    if(!ok) return memo[x][me][up][rt][sp] = INF;

    bool covered = 0;
    if(up) covered = 1;
    if(x == special && rt) covered = 1;
    if(x == root && sp) covered = 1;
    
    int sum = me;
    for(int v : adj[x]){
        if(v == par[x]) continue;
        sum += dp(v, 0, me, rt, sp);
    }

    int res = INF;

    if(covered){
        res = min(res, sum);
    }
    else{
        for(int v : adj[x]){
            if(v == par[x]) continue;
            res = min(res, sum - dp(v, 0, me, rt, sp) + dp(v, 1, me, rt, sp));
        }
    }
    return memo[x][me][up][rt][sp] = res;
}


void solve() {
    cin >> n;
    memset(memo, -1, sizeof(memo));
    for(int i = 1; i <= n; i++){
        head[i] = i;
    }
    for(int i = 1; i <= n; i++){
        int u, v; cin >> u >> v;
        int pu = find(u);
        int pv = find(v);
        if(pu == pv){
            root = u;
            special = v;
        }
        else{
            head[pv] = pu;
            adj[u].push_back(v);
            adj[v].push_back(u);
        }
    }
    dfs(root, 0);
    int ans = INF;
    for(int rt = 0; rt <= 1; rt++){
        for(int sp = 0; sp <= 1; sp++){
            ans = min(ans, dp(root, rt, 0, rt, sp));
        }
    }
    if(ans == INF){
        cout <<"-1\n";
    }
    else{
        cout << ans << '\n';
    }
}

signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int tt;
    tt = 1;
    while (tt--) {
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...