U jednom kraljevstvu postoji \(n\) gradova označenih brojevima \(1, 2, \ldots, n\). Neki parovi gradova povezani su drumom.
Kraljevska gradske službe rade na tačno 4 radio-kanala koji su
označeni slovima A
, B
, C
,
D
.
Radio-signal se prenosi duž druma između dva neposredno povezana grada. Ako bi oba grada koristila isti kanal/oznaku, poruke i signali bi se mešali. Zato svaki par gradova povezan drumom mora imati različite kanale/oznake.
Dodeliti svakom gradu jedan od kanala, tako da ne postoje dva grada, povezana drumom, koja imaju isti kanal.
Sa standardnog ulaza se prvo unose broj gradova \(n\) (\(1 \leq n \leq 80\)) i broj drumova \(m\) (\(1 \leq m \leq \frac{n(n-1)}{2}\)). U narednih \(m\) redova, unose se drumovi, odnosno dva grada \(u\) i \(v\) koja su povezana drumom (\(1 \leq u < v \leq n\)).
Na standardni izlaz:
DA
i u zasebnom redu
dodeljeni kanal (A
, B
, C
, ili
D
) za svaki grad \(i\)
(\(1 \leq i \leq n\)). Prihvata se samo
leksikografski najmanja dodela.NE
.4 4 1 2 2 3 3 4 4 1
DA A B A B
Gradovi su povezani u ciklus, te je dovoljno koristiti samo 2 kanala.
Postoji više mogućih dodela, ali leksikogfarski najmanja dodela je
A B A B
.
5 10 1 2 1 3 1 4 1 5 2 3 2 4 2 5 3 4 3 5 4 5
NE
Pet gradova gde su bilo koja dva grada povezana drumom. Ukoliko prva
četiri grada dobiju kanala A B C D
, peti grad ne može
dobiti nijedan od kanala A
, B
, C
,
ili `D.
U ovom bloku se opisuje glavno rešenje zadatka.
#include <iostream>
#include <vector>
#include <string>
using namespace std;
static string channels = "ABCD";
bool assign_channels(vector<char> &assignment, const int u,
const vector<vector<int>> &neighbours)
{
if (u == assignment.size()) {
return true;
}
for (auto channel : channels) {
bool can_assign = true;
for (auto v : neighbours[u]) {
if (assignment[v] == channel) {
= false;
can_assign }
}
if (can_assign) {
[u] = channel;
assignmentif (assign_channels(assignment, u + 1, neighbours)) {
return true;
}
[u] = '.';
assignment}
}
return false;
}
void assign(const vector<vector<int>> &neighbours)
{
int n = neighbours.size();
<char> assignment(n, ' ');
vectorif (assign_channels(assignment, 0, neighbours)) {
<< "DA" << endl;
cout for (auto channel : assignment) {
<< channel << ' ';
cout }
<< endl;
cout } else {
<< "NE" << endl;
cout }
}
int main()
{
int n, m; cin >> n >> m;
<vector<int>> neighbours(n);
vector
for (int i = 0; i < m; i++) {
int u, v; cin >> u >> v;
[u - 1].push_back(v - 1);
neighbours[v - 1].push_back(u - 1);
neighbours}
(neighbours);
assign
return 0;
}