Submission #1172066

#TimeUsernameProblemLanguageResultExecution timeMemory
1172066mnbvcxz123Graph (BOI20_graph)C++20
100 / 100
85 ms13220 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const double EPS = 1e-9;
struct Edge { int to, col; };
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, m; cin >> n >> m;
    vector<vector<Edge>> adj(n);
    for(int i=0;i<m;i++){
        int u, v, c; cin >> u >> v >> c;
        u--; v--;
        adj[u].push_back({v, c});
        adj[v].push_back({u, c});
    }
    vector<int> comp(n, -1);
    vector<double> A(n, 0.0), B(n, 0.0), ans(n, 0.0);
    int compID = 0;
    bool ok = true;
    for(int i=0;i<n;i++){
        if(comp[i] != -1) continue;
        vector<int> nodes;
        vector<double> cvals;
        bool fixedFlag = false;
        double fixedT = 0;
        queue<int>q;
        comp[i] = compID;
        A[i] = 1; B[i] = 0;
        q.push(i);
        nodes.push_back(i);
        while(!q.empty() && ok){
            int u = q.front(); q.pop();
            for(auto &e: adj[u]){
                int v = e.to; int col = e.col;
                double sum = (col==1 ? 1.0 : 2.0);
                if(comp[v] == -1){
                    comp[v] = compID;
                    A[v] = -A[u];
                    B[v] = sum - B[u];
                    q.push(v);
                    nodes.push_back(v);
                } else {
                    double coeff = A[u] + A[v];
                    double sumb = B[u] + B[v];
                    if(fabs(coeff) < EPS){
                        if(fabs(sumb - sum) > 1e-6) { ok = false; break; }
                    } else {
                        double tval = (sum - sumb) / coeff;
                        if(!fixedFlag){
                            fixedFlag = true;
                            fixedT = tval;
                        } else {
                            if(fabs(fixedT - tval) > 1e-6){ ok = false; break; }
                        }
                    }
                }
            }
        }
        if(!ok) break;
        if(fixedFlag){
            for(auto u: nodes)
                ans[u] = A[u]*fixedT + B[u];
        } else {
            for(auto u: nodes){
                if(fabs(A[u]-1) < EPS)
                    cvals.push_back(-B[u]);
                else
                    cvals.push_back(B[u]);
            }
            sort(cvals.begin(), cvals.end());
            double t;
            int sz = cvals.size();
            if(sz % 2 == 1) t = cvals[sz/2];
            else t = (cvals[sz/2-1] + cvals[sz/2]) / 2.0;
            for(auto u: nodes)
                ans[u] = A[u]*t + B[u];
        }
        compID++;
    }
    if(!ok) { cout << "NO\n"; return 0; }
    cout << "YES\n";
    cout << fixed << setprecision(9);
    for(int i=0;i<n;i++){
        cout << ans[i] << (i==n-1? "\n" : " ");
    }
    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...