svetiljke

U gradu ima \(N\) raskrsnica povezanih sa \(𝑀\) ulica. Svaka ulica povezuje tačno dve raskrsnice i može se koristiti u oba smera. Grad želi da postavi svetiljke na raskrsnice pod sledećim pravilom:

Jedna svetiljka na raskrsnici osvetljava sve ulice koje iz nje polaze.

Opis ulaza

Sa standardnog ulaza se prvo unose vrednosti \(N\) i \(M\). Nakon toga se u narednih \(M\) linija unose po dve vrednosti \(u\) i \(v\) koje označavaju da ulica povezuje raskrsnice \(u\) i \(v\).

Opis izlaza

Na standardni izlaz treba ispisati minimalan broj svetiljki potreban da se osvetle sve ulice u gradu, ili \(−1\) ukoliko ovakav raspored nije moguć.

Primer 1

Ulaz

6 5 0 1 0 3 0 4 1 2 2 3

Izlaz

2

Primer 2

Ulaz

3 3 0 1 0 2 1 2

Izlaz

-1

Rešenje

Opis glavnog rešenja

U ovom bloku se opisuje glavno rešenje zadatka.

#include <iostream>
#include <vector>
#include <queue>
#include <set>
#include <map>

using namespace std;

bool dfs(int cvor, int boja, vector<int>& colors, vector<vector<int>>& adj_list)
{
        colors[cvor] = boja;

        for (int sused : adj_list[cvor]) {
                if (colors[sused] == -1) {
                        if (!dfs(sused, 1 - boja, colors, adj_list))
                                return false;
                }
                else if (colors[sused] == boja)
                        return false;
        }
        return true;
}

int broj_svetiljki(int n, vector<int>& colors, vector<vector<int>>& adj_list)
{

        int boja = 1;
        for (int i = 0; i < n; i++) {
                if (colors[i] == -1)
                        if (!dfs(i, boja, colors, adj_list))
                                return -1;
        }

        int br1 = 0;
        int br2 = 0;
        for (int i = 0; i < n; i++) {
                if (colors[i] == 1) {
                        br1++;
                }
                else if (colors[i] == 0) {
                        br2++;
                }
        }

        return min(br1, br2);
}

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

        int n, m;
        cin >> n >> m;

        vector<vector<int>> adj_list(n);
        vector<int> colors(n, -1);

        for (int i = 0; i < m; i++) {
                int u, v;
                cin >> u >> v;
                adj_list[u].push_back(v);
                adj_list[v].push_back(u);
        }

        cout << broj_svetiljki(n, colors, adj_list);

        return 0;
}