#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
const int INF = 1e9;
const int MAXN = 2005;
struct Edge {
int to, cost;
};
int N, M;
vector<Edge> adj[MAXN];
int dist[MAXN];
bool visited[MAXN];
// Funkcje pomocnicze do komunikacji bitowej
void send_bit(int b) {
cout << "+ " << b << endl;
}
int read_bit() {
cout << "?" << endl;
int b;
cin >> b;
return b;
}
void send_int(int val, int bits) {
for (int i = bits - 1; i >= 0; --i) {
send_bit((val >> i) & 1);
}
}
int read_int(int bits) {
int val = 0;
for (int i = 0; i < bits; ++i) {
val = (val << 1) | read_bit();
}
return val;
}
void solve() {
string role;
cin >> role;
cin >> N >> M;
for (int i = 0; i < M; ++i) {
int u, v, c;
cin >> u >> v >> c;
adj[u].push_back({v, c});
adj[v].push_back({u, c});
}
for (int i = 1; i <= N; ++i) dist[i] = INF;
dist[1] = 0;
for (int i = 0; i < N; ++i) {
int best_v = -1;
for (int v = 1; v <= N; ++v) {
if (!visited[v] && (best_v == -1 || dist[v] < dist[best_v])) {
best_v = v;
}
}
int d = (best_v == -1) ? INF : dist[best_v];
int global_v, global_d;
if (role == "Algosia") {
// Algosia inicjuje porównanie
send_int(d, 20); // Wysyła swój dystans
int d_bajtek = read_int(20);
if (d <= d_bajtek) {
send_bit(0); // Algosia ma lepszy/równy
send_int(best_v, 11);
global_v = best_v;
global_d = d;
} else {
send_bit(1); // Bajtek ma lepszy
global_v = read_int(11);
global_d = d_bajtek;
}
} else {
// Bajtek odpowiada
int d_algosia = read_int(20);
send_int(d, 20);
int who_wins = read_bit();
if (who_wins == 0) {
global_v = read_int(11);
global_d = d_algosia;
} else {
send_int(best_v, 11);
global_v = best_v;
global_d = d;
}
}
visited[global_v] = true;
dist[global_v] = global_d;
// Relaksacja krawędzi lokalnych
for (auto& e : adj[global_v]) {
if (dist[global_v] + e.cost < dist[e.to]) {
dist[e.to] = dist[global_v] + e.cost;
}
}
}
if (role == "Algosia") {
cout << "!";
for (int i = 1; i <= N; ++i) cout << " " << dist[i];
cout << endl;
}
}
int main() {
ios_base::sync_with_stdio(false);
solve();
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | #include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std; const int INF = 1e9; const int MAXN = 2005; struct Edge { int to, cost; }; int N, M; vector<Edge> adj[MAXN]; int dist[MAXN]; bool visited[MAXN]; // Funkcje pomocnicze do komunikacji bitowej void send_bit(int b) { cout << "+ " << b << endl; } int read_bit() { cout << "?" << endl; int b; cin >> b; return b; } void send_int(int val, int bits) { for (int i = bits - 1; i >= 0; --i) { send_bit((val >> i) & 1); } } int read_int(int bits) { int val = 0; for (int i = 0; i < bits; ++i) { val = (val << 1) | read_bit(); } return val; } void solve() { string role; cin >> role; cin >> N >> M; for (int i = 0; i < M; ++i) { int u, v, c; cin >> u >> v >> c; adj[u].push_back({v, c}); adj[v].push_back({u, c}); } for (int i = 1; i <= N; ++i) dist[i] = INF; dist[1] = 0; for (int i = 0; i < N; ++i) { int best_v = -1; for (int v = 1; v <= N; ++v) { if (!visited[v] && (best_v == -1 || dist[v] < dist[best_v])) { best_v = v; } } int d = (best_v == -1) ? INF : dist[best_v]; int global_v, global_d; if (role == "Algosia") { // Algosia inicjuje porównanie send_int(d, 20); // Wysyła swój dystans int d_bajtek = read_int(20); if (d <= d_bajtek) { send_bit(0); // Algosia ma lepszy/równy send_int(best_v, 11); global_v = best_v; global_d = d; } else { send_bit(1); // Bajtek ma lepszy global_v = read_int(11); global_d = d_bajtek; } } else { // Bajtek odpowiada int d_algosia = read_int(20); send_int(d, 20); int who_wins = read_bit(); if (who_wins == 0) { global_v = read_int(11); global_d = d_algosia; } else { send_int(best_v, 11); global_v = best_v; global_d = d; } } visited[global_v] = true; dist[global_v] = global_d; // Relaksacja krawędzi lokalnych for (auto& e : adj[global_v]) { if (dist[global_v] + e.cost < dist[e.to]) { dist[e.to] = dist[global_v] + e.cost; } } } if (role == "Algosia") { cout << "!"; for (int i = 1; i <= N; ++i) cout << " " << dist[i]; cout << endl; } } int main() { ios_base::sync_with_stdio(false); solve(); return 0; } |
English