Submission #945465

#TimeUsernameProblemLanguageResultExecution timeMemory
945465LucaIlieGraph (BOI20_graph)C++17
100 / 100
202 ms23496 KiB
#include <bits/stdc++.h> using namespace std; struct edge { int u, v, c; int other( int x ) { return u ^ v ^ x; } }; const int MAX_N = 1e5; const int MAX_M = 2e5; bool vis[MAX_N + 1]; int a[MAX_N + 1], b[MAX_N + 1]; double val[MAX_N + 1]; edge edges[MAX_M]; vector<int> adj[MAX_N + 1]; bool sePoate; bool fixedX; double x; vector<int> vert; void dfs( int u ) { vert.push_back( u ); vis[u] = true; for ( int e: adj[u] ) { int v = edges[e].other( u ), c = edges[e].c; if ( !vis[v] ) { a[v] = -a[u]; b[v] = c - b[u]; dfs( v ); } else { if ( a[u] + a[v] == 0 ) { if ( b[u] + b[v] != c ) sePoate = false; } else { double xx = ((double)c - b[u] - b[v]) / (a[u] + a[v]); if ( fixedX && x != xx ) sePoate = false; else { fixedX = true; x = xx; } } } } } int main() { int n, m; cin >> n >> m; for ( int i = 0; i < m; i++ ) { cin >> edges[i].u >> edges[i].v >> edges[i].c; adj[edges[i].u].push_back( i ); adj[edges[i].v].push_back( i ); } for ( int v = 1; v <= n; v++ ) { if ( vis[v] ) continue; a[v] = 1; b[v] = 0; sePoate = true; fixedX = false; vert.clear(); dfs( v ); if ( !sePoate ) { cout << "NO\n"; return 0; } //for ( int u: vert ) //cout << u << " " << a[u] << " " << b[u] << "\n"; if ( !fixedX ) { map<int, vector<int>> events; int sa = 0, sb = 0; for ( int u: vert ) { sa--; if ( a[u] == 1 ) sb -= b[u]; else sb += b[u]; events[(-b[u] / a[u])].push_back( u ); //cout << (-b[u] / a[u]) << "\n"; } int minS = 1e9; for ( auto p: events ) { for ( int u: p.second ) { if ( a[u] == 1 ) { sa += 2; sb += b[u] * 2; } else { sa += 2; sb -= b[u] * 2; } } int xx = (sa >= 0 ? p.first : events.upper_bound( p.first )->first); if ( sa * xx + sb < minS ) { minS = sa * xx + sb; x = xx; } //cout << xx << " " << sa << " " << sb << " " << sa * xx + sb << "\n"; } } for ( int u: vert ) val[u] = x * a[u] + b[u]; } cout << "YES\n"; for ( int v = 1; v <= n; v++ ) cout << val[v] << " "; 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...