Submission #917370

#TimeUsernameProblemLanguageResultExecution timeMemory
917370NK_Graph (BOI20_graph)C++17
34 / 100
72 ms3164 KiB
// Success consists of going from failure to failure without loss of enthusiasm #include <bits/stdc++.h> using namespace std; #define nl '\n' #define pb push_back #define f first #define s second #define mp make_pair #define sz(x) int(x.size()) template<class T> using V = vector<T>; using pi = pair<int, int>; using vi = V<int>; using vpi = V<pi>; using db = long double; const int INF = 1e9; const int B = 1e8; const db EPS = 1e-11; const db BEPS = 1e-8; int main() { cin.tie(0)->sync_with_stdio(0); int N, M; cin >> N >> M; V<vpi> adj(N); for(int i = 0; i < M; i++) { int u, v, w; cin >> u >> v >> w; --u, --v; adj[u].pb(mp(v, w)); adj[v].pb(mp(u, w)); } auto C = [&](pi p, int w) { // cout << p.f << " " << p.s << " " << w << endl; return mp(w - p.f, -p.s); }; cout << fixed << setprecision(10); vi vis(N), COMP; V<set<pi>> S(N); function<void(int)> dfs = [&](int u) { vis[u] = 1; COMP.pb(u); pi p = *begin(S[u]); // cout << u << " => " << p.f << " " << p.s << endl; for(auto& e : adj[u]) { int v, w; tie(v, w) = e; // cout << v << " " << w << endl; S[v].insert(C(p, w)); if (!vis[v]) dfs(v); } }; V<db> ans(N, INF); function<void(int)> get = [&](int u) { // cout << u << endl; for(auto& e : adj[u]) { int v, w; tie(v, w) = e; // cout << u << " => " << v << endl; // cout << ans[u] << " -> " << ans[v] << endl; db x = w - ans[u]; if (ans[v] > B) { ans[v] = x; get(v); } else { if (abs(ans[v] - x) > EPS) { cout << "NO" << nl; exit(0-0); } } } }; for(int r = 0; r < N; r++) if (!vis[r]) { COMP = {}; S[r].insert(mp(0, 1)); dfs(r); // cout << endl << endl; db x = INF; int R = -1; for(auto& i : COMP) if (sz(S[i]) >= 2) { // cout << i << endl; vi pos, neg; for(auto& p : S[i]) { // cout << p.f << " " << p.s << endl; if (p.s == -1) neg.pb(p.f); else pos.pb(p.f); } if (max(sz(pos), sz(neg)) > 1) { cout << "NO" << nl; exit(0-0); } x = db(pos.back() + neg.back()) / db(2); // cout << x << endl; R = i; // cout << "DONE" << endl; break; } if (R == -1) { // cout << "R: " << r << endl; db bst = -INF, val = INF; auto check = [&](db x) { ans[r] = x; get(r); db cost = 0; for(auto& i : COMP) cost += abs(ans[i]), ans[i] = INF; // cout << x << " => " << cost << endl; if (cost + EPS < val) bst = x, val = cost; return cost; }; db lo = -INF, hi = INF; for(int t = 0; t < 100; t++) { db mid = (lo + hi) / 2; if (check(mid) < check(mid + BEPS)) hi = mid; else lo = mid; } // cout << bst << endl; ans[r] = bst; get(r); } else { ans[R] = x; get(R); } } cout << "YES" << nl; for(auto& x : ans) cout << x << " "; cout << nl; exit(0-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...
#Verdict Execution timeMemoryGrader output
Fetching results...