Submission #1207960

#TimeUsernameProblemLanguageResultExecution timeMemory
1207960avighnaGraph (BOI20_graph)C++20
100 / 100
92 ms21440 KiB
#include <bits/stdc++.h>

int main() {
  std::ios_base::sync_with_stdio(false);
  std::cin.tie(nullptr);

  int n, m;
  std::cin >> n >> m;
  std::vector<std::vector<std::pair<int, int>>> g(n + 1);
  for (int i = 0, a, b, c; i < m; ++i) {
    std::cin >> a >> b >> c;
    g[a].push_back({b, c});
    g[b].push_back({a, c});
  }

  std::vector<bool> vis(n + 1);
  std::vector<int> nodes;
  auto dfs = [&](auto &&self, int u) {
    if (vis[u]) {
      return;
    }
    vis[u] = true;
    nodes.push_back(u);
    for (auto &[i, c] : g[u]) {
      self(self, i);
    }
  };
  std::vector<int> comps, comp_of(n + 1);
  std::vector<std::vector<int>> in_comp(n + 1);
  for (int i = 1; i <= n; ++i) {
    if (vis[i]) {
      continue;
    }
    dfs(dfs, i);
    in_comp[i] = nodes;
    comps.push_back(i);
    for (auto &u : nodes) {
      comp_of[u] = i;
    }
    nodes.clear();
  }
  vis.assign(n + 1, false);

  std::vector<std::pair<int, double>> val(n + 1);
  const int inf = 1e7;
  double x;
  bool x_found = false;
  auto dfs1 = [&](auto &&self, int u, int m, double c) {
    if (vis[u]) {
      auto [a, b] = val[u];
      if (a != m or std::abs(b - c) > 1e-6) {
        if (x_found) {
          return std::abs(m * x + c - a * x - b) < 1e-6;
        } else {
          if (m == a) {
            return false;
          }
          x = (b - c) / (m - a);
          return x_found = true;
        }
      }
      return true;
    }
    vis[u] = true;
    val[u] = {m, c};
    // val[u] + val[i] = {0, e}
    // val[i] = {0, e} - {m, c}
    for (auto &[i, e] : g[u]) {
      if (!self(self, i, -m, e - c)) {
        return false;
      }
    }
    return true;
  };
  std::vector<double> ans(n + 1);
  for (auto &u : comps) {
    if (!dfs1(dfs1, u, 1, 0)) {
      std::cout << "NO\n";
      return 0;
    }
    double _x;
    if (x_found) {
      _x = x;
    } else {
      std::vector<double> vals;
      for (auto &u : in_comp[u]) {
        auto [a, b] = val[u];
        if (a < 0) {
          a = -a, b = -b;
        }
        vals.push_back(-b);
      }
      std::sort(vals.begin(), vals.end());
      _x = vals[vals.size() / 2];
    }
    x_found = false;
    for (auto &u : in_comp[u]) {
      auto [m, c] = val[u];
      ans[u] = m * _x + c;
    }
  }

  std::cout << "YES\n";
  for (int i = 1; i <= n; ++i) {
    std::cout << ans[i] << ' ';
  }
  std::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...