Submission #1172146

#TimeUsernameProblemLanguageResultExecution timeMemory
1172146nrg_studioGraph (BOI20_graph)C++20
100 / 100
82 ms18368 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define pb push_back
#define pii pair<int,int>
#define f first
#define s second
#define chmin(a, b) a = min(a,b)
#define chmax(a, b) a = max(a,b)
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define F0R(i, a) for (int i = 0; i < (a); i++)
#define all(x) x.begin(),x.end()
#define vec vector

const int MAX_N = 1e5;
vec<pii> adj[MAX_N];
int ans[MAX_N];
int col[MAX_N] = {0};
vec<pii> comps;
vec<vec<int>> comps2;

void dfs(int cur, int color) {
    col[cur] = color+1;
    comps2.back().pb(cur);
    for (auto[x,c] : adj[cur]) {
        if (!col[x]) {
            ans[x] = c-ans[cur];
            dfs(x,!color);
        } else {
            if (col[x]==col[cur]) {
                comps.back().f = cur;
                comps.back().s = (c-ans[cur]-ans[x])/2;
            }
        }
    }
}

int main() {
    ios::sync_with_stdio(false); cin.tie(0);

    int n, m; cin >> n >> m;
    for (int i=0;i<m;i++) {
        int a, b, c; cin >> a >> b >> c;
        adj[--a].pb({--b,2*c});
        adj[b].pb({a,2*c});
    }
    for (int i=0;i<n;i++) {
        if (!col[i]) {
            comps.pb({-1,-1});
            comps2.pb({});
            dfs(i,0);
        }
    }
    for (int c=0;c<comps.size();c++) {
        auto[rt,delta] = comps[c];
        if (rt==-1) {
            rt = comps2[c][0];
            vec<int> idx;
            for (int i : comps2[c]) {
                if (col[i]==col[rt]) {idx.pb(-ans[i]);}
                else {idx.pb(ans[i]);}
            }
            sort(all(idx));
            delta = idx[(idx.size()-1)/2];
        }
        for (int i : comps2[c]) {
            ans[i] += (col[i]==col[rt] ? 1 : -1)*delta;
        }
    }

    bool flag = false;
    for (int i=0;i<n;i++) {
        for (auto[x,c] : adj[i]) {
            if (ans[x]+ans[i]!=c) {flag = true;}
        }
    }

    if (flag) {cout << "NO\n";}
    else {
        cout << "YES\n";
        cout << fixed << setprecision(1);
        for (int i=0;i<n;i++) {
            cout << (double)ans[i]/2 << ' ';
        }
    }

}
#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...