#include #include #define MAXN 1000000 using namespace std; // Struktura popisující hranu (výchozí vrchol dle umístění v poli) struct hrana { int kam; int rozdil; }; int oznaceni_vrcholu[MAXN]; // Pole s napěťovou hladinou vrcholů vector hrany_vrcholu[MAXN]; // pole se seznamy hran u vrcholů /** * DFS očekává dva paramety * kde -- jaký vrchol prohledávám * oznaceni -- jakou hladinu se mu snažím přiřadit */ int dfs(int kde, int oznaceni) { if (oznaceni_vrcholu[kde] != -1) { // Už máme označený zkoumaný vrchol return oznaceni_vrcholu[kde] == oznaceni; // Vrátíme jeslti se označení shodují } oznaceni_vrcholu[kde] = oznaceni; // Označíme vrchol příslušnou hladinou int ok = 1; for (int i = 0; i < hrany_vrcholu[kde].size(); ++i) { // Zavoláme dfs na všechny inclidentní hrany a budeme se je snažit obarvit barvou "moje barva XOR ohodnocení hrany" ok &= dfs(hrany_vrcholu[kde][i].kam, oznaceni ^ hrany_vrcholu[kde][i].rozdil); // Hlídáme si, že ani jedno dfs nenarazilo na spor } return ok; } /*** * Formát vstupu: * int n, m -- počet uzlů a počet vodičů * m řádků formátu "a b h", kde "a" a "b" jsou indexy vrcholů, který * daná hrana spojuje a h je 0 nebo 1 podle rozdílu na vodiči */ int main() { int i, a, b, h; int n, m; scanf("%d%d", &n, &m); // Inicializace označení vrcholů for (i = 0; i < n; ++i) oznaceni_vrcholu[i] = -1; // Načítání vstupu for (i = 0; i < m; ++i) { scanf("%d%d%d", &a, &b, &h); hrany_vrcholu[a].push_back( (struct hrana) {b, h} ); hrany_vrcholu[b].push_back( (struct hrana) {a, h} ); } if (!dfs(0, 0)) { // Nejprve se zavoláme na nultý vrchol a přiřadíme mu nulovou hladinou // Pokud obarvení neexistuje vypíšeme -1 a končíme printf("-1\n"); return 0; } // Vypisování výstupu for (i = 0; i < n; ++i) { printf("%d\n", oznaceni_vrcholu[i]); } return 0; }