Submission #520000

#TimeUsernameProblemLanguageResultExecution timeMemory
520000goodluck2020Logičari (COCI21_logicari)C++14
10 / 110
202 ms26492 KiB
#include <bits/stdc++.h> #define task "main" using namespace std; const long long inf = 1e9; const int N = 1e5 + 5; int n, RootTree, Spec, Par[N]; vector < int > V[N]; struct DisjointSet { int par[N]; void init() { for(int i = 1; i <= 1e5; i++) par[i] = -1; } int root(int u) { return (par[u] < 0) ? u : (par[u] = root(par[u])); } void Merge(int u, int v) { if((u = root(u)) == (v = root(v))) return; if(par[u] > par[v]) swap(u, v); par[u] += par[v]; par[v] = u; } } DSU; void DFS(int u) { for(int v : V[u]) if(v != Par[u]) { Par[v] = u; DFS(v); } } int dp[N][2][2][2][2]; int Sol(int x, int me, int up, int rt, int sp) { if(x == RootTree && me != rt) return inf; if(x == Spec && me != sp) return inf; if(x == Spec && up && rt) return inf; if(dp[x][me][up][rt][sp] != -1) return dp[x][me][up][rt][sp]; bool covered = 0; if(up) covered = 1; if(x == RootTree && sp) covered = 1; if(x == Spec && rt) covered = 1; long long sum = me, Min = 1e9; for(int v : V[x]) if(v != Par[x]) { sum += 1LL * Sol(v, 0, me, rt, sp); Min = min(Min, 1LL * (Sol(v, 1, me, rt, sp) - Sol(v, 0, me, rt, sp))); } if(covered) return dp[x][me][up][rt][sp] = sum; return dp[x][me][up][rt][sp] = min(sum + Min, inf); } int main() { if(fopen(task ".inp","r")) { freopen(task ".inp","r",stdin); freopen(task ".out","w",stdout); } ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n; DSU.init(); for(int i = 1; i <= n; i++) { int u, v; cin >> u >> v; if(DSU.root(u) == DSU.root(v)) { RootTree = u; Spec = v; } else { DSU.Merge(u, v); V[u].push_back(v); V[v].push_back(u); } } DFS(RootTree); for(int i = 0; i <= n; i++) for(int me = 0; me <= 1; me++) for(int up = 0; up <= 1; up++) for(int rt = 0; rt <= 1; rt++) for(int sp = 0; sp <= 1; sp++) dp[i][me][up][rt][sp] = -1; int ans = inf; for(int rt = 0; rt <= 1; rt++) for(int sp = 0; sp <= 1; sp++) ans = min(ans, Sol(RootTree, rt, 0, rt, sp)); if(ans == inf) cout << -1; else cout << ans; }

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:63:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   63 |         freopen(task ".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:64:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   64 |         freopen(task ".out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...