Submission #1198147

#TimeUsernameProblemLanguageResultExecution timeMemory
1198147brover29Logičari (COCI21_logicari)C++17
10 / 110
105 ms33312 KiB
#include <bits/stdc++.h>
//qwerty47924692
using namespace std;
using ll = long long;
const ll N=1e5+29;
const string br="617283";
#define sz(a)(ll)a.size()
#define f first
#define s second
ll n,pr[N],dp[N][2][2][2][2],root,special;
vector<ll>g[N];
ll get(ll x){
    return(x==pr[x] ? x : pr[x]=get(pr[x]));
}ll calc(ll v,ll me,ll up,ll rt,ll sp,ll pr=0){
    if(dp[v][me][up][rt][sp]!=-1)return dp[v][me][up][rt][sp];

    ll ok=1;
    if(v==root&&rt!=me)ok=0;
    if(v==special&&sp!=me)ok=0;
    if(v==special&&rt&&up)ok=0;
    if(!ok)return dp[v][me][up][rt][sp]=1e18;

    ll check=0;
    if(up)check=1;
    if(v==root&&sp)check=1;
    if(v==special&&rt)check=1;

    ll sum=me;
    ll diff=1e18;
    for(auto to:g[v]){
        if(to==pr)continue;
        sum+=calc(to,0,me,rt,sp,v);
        diff=min(diff,calc(to,1,me,rt,sp,v)-calc(to,0,me,rt,sp,v));
    }
    return min((ll)1e18,dp[v][me][up][rt][sp]=(sum+diff*(!check)));
}
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin>>n;
    memset(dp,-1,sizeof(dp));
    for(ll i=1;i<=n;i++)pr[i]=i;
    for(ll i=1;i<=n;i++){
        ll v,u;
        cin>>v>>u;
        if(get(v)==get(u)){
            root=v;
            special=u;
            continue;
        }
        pr[get(v)]=get(u);
        g[v].push_back(u);
        g[u].push_back(v);
    }
    ll ans=1e18;
    for(ll rt=0;rt<2;rt++){
        for(ll sp=0;sp<2;sp++){
            ans=min(ans,calc(root,rt,0,rt,sp));
        }
    }
    cout<<(ans==1e18 ? -1 : ans);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...