Submission #1168552

#TimeUsernameProblemLanguageResultExecution timeMemory
1168552ElayV13Graph (BOI20_graph)C++20
17 / 100
4 ms4424 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define ld long double

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const int MXN = 100005;
const int INF = 1e18;

int n , m , u[MXN] , v[MXN] , c[MXN] , com[MXN] , cur_com = 0 , f = 0;
vector < pair < int , int > > adj[MXN];
bool vis[MXN];
ld valx[MXN] , s = 0;

void dfs(int v)
{
        com[v] = cur_com;
        vis[v] = 1;
        for(pair < int , int > u : adj[v])
        {
                if(!vis[u.first])
                {
                        dfs(u.first);
                }
        }
}

vector < vector < int > > comp;

vector < bool > used(MXN , false);

vector < ld > res(MXN , -1);

vector < int > nodes;

void init(int n){
        nodes.clear();
        f = s = 0;
        for(int i = 1;i <= n;i++) valx[i] = -100 , used[i] = 0;
}

void calc(int node)
{
        nodes.push_back(node);
        used[node] = 1;
        s += abs(valx[node]);
        for(pair < int , int > u : adj[node])
        {
                int color = u.second;
                int v = u.first;
                if(!used[v])
                {
                        valx[v] = ((color == 2) ? (2 - valx[node]) : (1 - valx[node]));
                        calc(v);
                }
                else
                {
                        int req = ((color == 2) ? 2 : 1);
                        if(valx[v] + valx[node] != req)
                        {
                                f = 1;
                        }
                }
        }
}

signed main(){
      ios_base::sync_with_stdio(0);cin.tie(0);
      cin >> n >> m;
      for(int i = 1;i <= m;i++)
      {
              cin >> u[i] >> v[i] >> c[i];
              adj[u[i]].push_back({v[i] , c[i]});
              adj[v[i]].push_back({u[i] , c[i]});
      }
      for(int i = 1;i <= n;i++)
      {
              if(!vis[i])
              {
                      ++cur_com;
                      dfs(i);
              }
      }
      comp.resize(cur_com + 1);
      for(int i = 1;i <= n;i++)
      {
              comp[com[i]].push_back(i);
      }
      for(int i = 0;i < comp.size();i++)
      {
              if(!comp[i].size()) continue;
              int node = comp[i][0];
              int cnt = 0;
              ld mn = INF;
              for(int val = 0;val <= 200;val++)
              {
                      ld db_val = val;
                      init(n);
                      valx[node] = db_val / 10;
                      calc(node);
                      cnt += !f;
                      if(!f)
                      {
                              if(s < mn)
                              {
                                      for(int v : nodes) res[v] = valx[v];
                                      mn = s;
                              }
                      }
              }
              if(!cnt)
              {
                      cout << "NO" << endl;
                      return 0;
              }
      }
      cout << "YES" << "\n";
      for(int i = 1;i <= n;i++)
      {
              cout << res[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...