Submission #1289325

#TimeUsernameProblemLanguageResultExecution timeMemory
1289325djawadmainGraph (BOI20_graph)C++20
0 / 100
3 ms348 KiB
#include<iostream>
#include<vector>

using namespace std;

#define ll long long
#define ld long double
#define pii pair<ll, ll>
#define RUN_LIKE_DJAWAD (ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0));
#define pb push_back
#define pf push_front
#define ff first
#define ss second
#define maxn 100001

pii st[maxn];
vector<int> uv;

vector<int> g2[maxn], g4[maxn];

bool seen[maxn];

int val[maxn];

void dfs(int v, int a, int b){

    seen[v] = true;
    st[v] = {a, b};
    uv.pb(v);

    for (int u: g2[v]) if (not seen[u]) dfs(u, -a, 2 - b);
    for (int u: g4[v]) if (not seen[u]) dfs(u, -a, 4 - b);

}

ll check(int mid){

    ll ans = 0;

    for (int u: uv) ans += abs(mid * st[u].ff + st[u].ss);

    return ans;
}

void SC(int rt){

    dfs(rt, 1, 0);

    int vs = -1, z = -1, k = -1;

    for (int v: uv){

        for (int u: g2[v]){

            if ((st[u].ff != st[v].ff * -1) or (st[u].ss + st[v].ss != 2)){

                vs = u;
                z = st[v].ff * -1;
                k = 2 - st[v].ss;
            }
        }

        for (int u: g4[v]){

            if ((st[u].ff != st[v].ff * -1) or (st[u].ss + st[v].ss != 4)){

                vs = u;
                z = st[v].ff * -1;
                k = 4 - st[v].ss;
            }
        }
    }

    int l = -1e6, r = 1e6;

    if (vs != -1){

        int nx = k - st[vs].ss;

        if (z == st[vs].ff) return;

        nx /= (st[vs].ff - z);

        l = nx;
        r = nx;
    }

    

    while (l < r){

        int m1 = (l + r) >> 1;
        int m2 = m1 + 1;

        ll r1 = check(m1);
        ll r2 = check(m2);

        if (r1 <= r2) r = m2 - 1;
        else l = m1 + 1;
    }

    for (int u: uv) val[u] = (l * st[u].ff + st[u].ss);
}

int n, m, ui, vi, ti;

int main(){

    RUN_LIKE_DJAWAD

    cin >> n >> m;

    while (m--){

        cin >> ui >> vi >> ti;

        if (ti == 1){

            g2[ui].pb(vi);
            g2[vi].pb(ui);

        } else {

            g4[ui].pb(vi);
            g4[vi].pb(ui);
        }
    }

    for (int i = 1; i <= n; i++) if (not seen[i]) SC(i);

    bool ok = true;

    for (int i = 1; i <= n; i++){

        for (int u: g2[i]) if (val[i] + val[u] != 2) ok = false;
        for (int u: g4[i]) if (val[i] + val[u] != 4) ok = false;
    }

    if (not ok){

        cout << "NO\n";
        return 0;
    }

    cout << "YES\n";

    for (int i = 1; i <= n; i++){

        ld vv = val[i];
        cout << vv / 2 << " ";
    }

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