Submission #1030644

#TimeUsernameProblemLanguageResultExecution timeMemory
1030644thinknoexitGraph (BOI20_graph)C++17
100 / 100
98 ms19912 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, M[N], C[N]; mt19937 rnd(time(NULL)); 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; } void dfs_eq(int v) { ch[v] = 1; for (auto& x : adj[v]) { if (!ch[x.v]) { M[x.v] = -M[v]; C[x.v] = x.w - C[v]; dfs_eq(x.v); } else { if (M[x.v] != -M[v] || C[x.v] != x.w - C[v]) { cout << "NO"; exit(0); } } } } 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; } // y = mx + c M[i] = 1, C[i] = 0; dfs_eq(i); vector<int> v; for (auto& x : node) { v.push_back(-C[x] / M[x]); } sort(v.begin(), v.end()); int crit = v[(node.size() + 1) / 2 - 1]; for (auto& x : node) { ans[x] = crit * M[x] + C[x]; } } 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...