Cod sursa(job #2790273)

Utilizator bogdanvladmihaiBogdan Vlad-Mihai bogdanvladmihai Data 28 octombrie 2021 18:10:59
Problema Andrei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("andrei.in");
ofstream out("andrei.out");

const int maxN = (int)1e5;

int n, m;

vector<pair<int, int>> g[maxN];

bool used[maxN];

bool color[maxN];

vector<int> visited;

bool dfs(int u, int col) {
  if (used[u]) {
    return (bool)col == color[u];
  }
  color[u] = col;
  used[u] = true;
  visited.push_back(u);
  for (pair<int, int> pi : g[u]) {
    int v = pi.first, c = pi.second;
    if (c == 0) {
      if (col == 0 && !dfs(v, 1)) {
        return false;
      }
    } else if (c == 1) {
      if (col == 1 && !dfs(v, 0)) {
        return false;
      }
    } else {
      if (!dfs(v, col)) {
        return false;
      }
    }
  }
  return true;
}

int main() {
  in >> n >> m;
  for (int i = 0; i < m; i++) {
    int u, v, z;
    in >> u >> v >> z;
    u--; v--;
    g[u].emplace_back(v, z);
    g[v].emplace_back(u, z);
  }
  for (int i = 0; i < n; i++) {
    if (!used[i]) {
      visited.clear();
      if (!dfs(i, 1)) {
        for (int u : visited) {
          used[u] = false;
        }
        visited.clear();
        assert(dfs(i, 0));
      }
    }
  }
  for (int i = 0; i < n; i++) {
    out << color[i] << " ";
  }
  return 0;
}