Submission #1291041

#TimeUsernameProblemLanguageResultExecution timeMemory
1291041al95ireyizLogičari (COCI21_logicari)C++20
110 / 110
104 ms30968 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define vll vector<ll>
#define len(x) (ll)x.size()
const ll INF = 1e9, INFL = 1e18;
const ll MOD = 1e9 + 7;
const ll maxn = 1e5 + 5;
 
ll n, m, k = 0;

vll g[maxn];
ll r, sp;

bitset<maxn>vis;
void get_cyc(ll u, ll p = -1){
    vis[u] = 1;
    for(auto v : g[u]){
        if(v == p) continue;
        else if(vis[v] == 0) get_cyc(v, u);
        else r = v, sp = u;

        if(r) return;
    }
}

ll dp[maxn][2][2][2][2];
#define dpp dp[u][col_u][col_p][col_r][col_sp]

ll dfs(ll u, ll p, ll col_u, ll col_p, ll col_r, ll col_sp){
    if(dpp != -1) return dpp;
    
    if(u == r and col_u != col_r) return dpp = INF;
    if(u == sp and col_u != col_sp) return dpp = INF;
    if(u == r and col_p and col_sp) return dpp = INF;
    if(u == sp and col_p and col_r) return dpp = INF;


    dpp = INF;
    
    // eger gorduyu goy qonsu yoxdusa sadece bir dene qonsusunu goy qoya bilerem

    ll cm = col_u;
    for(auto v : g[u]){
        if(v == p) continue;
        if((u == r and v == sp) or (u == sp and v == r)) continue;
        cm += dfs(v, u, 0, col_u, col_r, col_sp);
    }
    // cout << u << ' ' << cm << '\n';
    if(col_p == 1 or (u == r and col_sp) or (u == sp and col_r)){
        // onda uje hec birini goy qoya bilmerem
        dpp = min(dpp, cm);
    }
    else{
        // birini goy qoymaliyam
        for(auto v : g[u]){
            if(v == p) continue;
            if((u == r and v == sp) or (u == sp and v == r)) continue;
            ll sf = dfs(v, u, 0, col_u, col_r, col_sp);
            ll br = dfs(v, u, 1, col_u, col_r, col_sp);
            dpp = min(dpp, cm - sf + br);
        }
    }
    return dpp;
}
void _() {
    // n dene node var deye bir dene cycle var
    // bu cycle-i nezere alib dp yaza bilerik

    cin >> n;
    for(ll i = 1, x, y; i <= n; i ++){
        cin >> x >> y;
        g[x].push_back(y);
        g[y].push_back(x);
    }

    ll leaf = -1;
    for(ll i = 1; i <= n; i ++) if(len(g[i]) == 1){ leaf = i; break; }
    if(leaf == -1){
        cout << (n % 4 == 0 ? n / 2 : -1) << '\n';
        return;
    }
    get_cyc(1);

    // dp[u][col_u][col_p][col_r][col_sp]
    // u node-u, onun coloru, parentin coloru, root-un coloru, special node-un coloru

    memset(dp, -1, sizeof(dp));
    ll cv = INF;
    for(ll col_r : {0, 1}) for(ll col_sp : {0, 1}){
        
        cv = min(cv, dfs(r, -1, col_r, 0, col_r, col_sp));
    }
    cout << (cv == INF ? -1 : cv) << '\n';
}
signed main() {
    cin.tie(0)->sync_with_stdio(0);
    ll t = 1;
    // cin >> t;
    while(t --) _();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...