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:
Za svaku ulicu mora postojati tačno jedna svetiljka na jednom od njenih krajeva.
Ako nijedan kraj nema svetiljku, ulica bi ostala u potpunom mraku i bila nesigurna.
Ako oba kraja imaju svetiljke, ulica bi bila osvetljena sa obe strane, što predstavlja nepotrebno dupliranje i trošak.
Jedna svetiljka na raskrsnici osvetljava sve ulice koje iz nje polaze.
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\).
Na standardni izlaz treba ispisati minimalan broj svetiljki potreban da se osvetle sve ulice u gradu, ili \(−1\) ukoliko ovakav raspored nije moguć.
6 5 0 1 0 3 0 4 1 2 2 3
2
3 3 0 1 0 2 1 2
-1
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;
}