Submission #1030477

#TimeUsernameProblemLanguageResultExecution timeMemory
1030477thinknoexitGraph (BOI20_graph)C++17
58 / 100
1062 ms17104 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int N = 100100; struct A { int v, w; }; vector<A> adj[N]; double ans[N]; bool ch[N], vis[N]; int col[N], bp = 0; vector<pair<int, int>> cycle; void dfs(int v, vector<int>& node) { node.push_back(v); vis[v] = 1; for (auto& x : adj[v]) { if (!vis[x.v]) dfs(x.v, node); } } void dfs_ans(int v) { for (auto& x : adj[v]) { if (!ch[x.v]) { ch[x.v] = 1; ans[x.v] = x.w - ans[v]; dfs_ans(x.v); } } } bool bipartite(int v, int c) { if (col[v]) { if (col[v] != c) return bp = v, false; else return true; } col[v] = c; for (auto& x : adj[v]) { if (!bipartite(x.v, 3 - c)) { if (bp != 0) cycle.push_back({ v, x.w }); if (v == bp) bp = 0; return false; } } return true; } int main() { cin.tie(nullptr)->sync_with_stdio(false); int n, m; cin >> n >> m; for (int i = 1;i <= m;i++) { int u, v, w; cin >> u >> v >> w; adj[u].push_back({ v, w }); adj[v].push_back({ u, w }); } for (int i = 1;i <= n;i++) { if (vis[i]) continue; vector<int> node; dfs(i, node); bool bipar = bipartite(i, 1); if (!bipar) { vector<pair<int, int>> c = cycle; cycle.clear(); int root = c.back().first; int val = 0; for (int i = 0;i < (int)c.size();i++) { if (i & 1) val -= c[i].second; else val += c[i].second; } // value at node (root) = val / 2 ch[root] = 1; ans[root] = (double)val / 2; dfs_ans(root); continue; } int sz = node.size(); if (sz == 1) { continue; } // try V sz *= 4; sz = min(sz, 80); double mn = 1e9; int idx = -100; for (int V = -sz;V <= sz;V++) { ch[i] = 1; ans[i] = (double)V / 2; dfs_ans(i); double sum = 0; bool can = 1; for (auto& i : node) { ch[i] = 0; sum += abs(ans[i]); for (auto& x : adj[i]) { if (ans[i] + ans[x.v] != x.w) { can = 0; break; } } if (!can) break; } if (can) { if (sum < mn) { mn = sum; idx = V; } } } if (mn == 1e9) { cout << "NO"; return 0; } ch[i] = 1; ans[i] = (double)idx / 2; dfs_ans(i); } for (int i = 1;i <= n;i++) { for (auto& x : adj[i]) { if (ans[i] + ans[x.v] != x.w) { cout << "NO"; return 0; } } } cout << "YES\n"; for (int i = 1;i <= n;i++) { cout << ans[i] << ' '; } return 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...