Cod sursa(job #2790266)

Utilizator bogdanvladmihaiBogdan Vlad-Mihai bogdanvladmihai Data 28 octombrie 2021 18:03:20
Problema Andrei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 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) {
  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) {
        if (used[v]) {
          if (color[v] == 0) {
            return false;
          }
        } else {
          dfs(v, 1);
        }
      }
    } else if (c == 1) {
      if (col == 1) {
        if (used[v]) {
          if (color[v] == 1) {
            return false;
          }
        } else {
          dfs(v, 0);
        }
      }
    } else {
      if (used[v]) {
        if (color[v] == color[u]) {
          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;
        }
        dfs(i, 0);
      }
    }
  }
  for (int i = 0; i < n; i++) {
    out << !color[i] << " ";
  }
  return 0;
}