Submission #729790

#TimeUsernameProblemLanguageResultExecution timeMemory
729790WonderfulWhaleGraph (BOI20_graph)C++17
100 / 100
218 ms38944 KiB
#include<bits/stdc++.h> using namespace std; #define int int64_t #define pb push_back #define st first #define nd second #define pii pair<int, int> #define double long double #define pdd pair<double, double> #define all(x) (x).begin(), (x).end() #define sz(x) (int)(x).size() const int MAXN = 100009; const double eps = 1e-9; bool f(double a, double b) { return abs(a-b)<eps; } vector<pair<int, double>> G[MAXN]; bool vis[MAXN]; pdd val[MAXN]; double ans[MAXN]; vector<int> v; void dfs(int x) { v.pb(x); vis[x] = true; for(auto [y, d]:G[x]) { if(vis[y]) continue; val[y] = {-val[x].st, d-val[x].nd}; dfs(y); } } int32_t main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout << fixed; cout.precision(10); int n, m; cin >> n >> m; for(int i=0;i<m;i++) { int a, b, c; cin >> a >> b >> c; G[a].pb({b, c}); G[b].pb({a, c}); } for(int i=1;i<=n;i++) { if(vis[i]) continue; v.clear(); val[i] = {1, 0}; dfs(i); pair<bool, double> forced = {false, 0}; for(int x:v) { for(auto [y, d]:G[x]) { if(f(val[x].st+val[y].st, 0)) { if(!f(val[x].nd+val[y].nd, d)) { cout << "NO\n"; return 0; } } else { double nx = (d-val[x].nd-val[y].nd)/(val[x].st+val[y].st); if(forced.st) { if(!f(forced.nd, nx)) { cout << "NO\n"; return 0; } } else { forced = {true, nx}; } } } } if(forced.st) { for(int x:v) { ans[x] = forced.nd*val[x].st+val[x].nd; } continue; } pdd sum = {0, 0}; vector<pair<double, pdd>> V; for(int x:v) { int root = -val[x].nd/val[x].st; sum.st -= 1; if(val[x].st>0) { sum.nd -= val[x].nd; V.pb({root, {2, val[x].nd*2}}); } else { sum.nd += val[x].nd; V.pb({root, {2, -val[x].nd*2}}); } } sort(all(V)); if(sum.st>0) { cout << "NO\n"; return 0; } pdd res = {sum.st*V[0].st+sum.nd, V[0].st}; for(auto x:V) { sum.st += x.nd.st; sum.nd += x.nd.nd; res = min(res, {sum.st*x.st+sum.nd, x.st}); } if(sum.st<0) { cout << "NO\n"; return 0; } for(int x:v) { ans[x] = res.nd*val[x].st+val[x].nd; } } cout << "YES\n"; for(int i=1;i<=n;i++) { cout << ans[i] << " "; } cout << "\n"; }
#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...