#include <cstdio>
#include "message.h"
#include "kollib.h"
int go(int A, int from, int prev)
{
int counter = 1;
while (from != A)
{
int p = FirstNeighbor(from);
if (p == prev)
p = SecondNeighbor(from);
prev = from;
from = p;
counter++;
}
return counter;
}
int N, ID, M, Q;
void master()
{
int k = 1;
int ans = 0;
int answers[Q];
for (int i=0; i<Q; i++)
{
int f, t;
f = QueryFrom(i+1);
t = QueryTo(i+1);
answers[i] = -1;
PutInt(k, f);
PutInt(k, t);
PutInt(k, 0);
PutInt(k, i);
Send(k);
k++; if (k == N) k = 1;
PutInt(k, f);
PutInt(k, t);
PutInt(k, 1);
PutInt(k, i);
Send(k);
k++; if (k == N) k = 1;
}
while (ans < Q*2)
{
int from = Receive(-1);
int a = GetInt(from);
int v = GetInt(from);
// fprintf(stderr, "answer for %i is %i\n", a, v);
if (answers[a] == -1 || answers[a] > v)
answers[a] = v;
ans++;
}
for (int i=0; i<Q; i++)
printf("%i\n", answers[i]);
}
void answer(int q, int v)
{
PutInt(0, q);
PutInt(0, v);
Send(0);
}
void slave()
{
Receive(0);
int f = GetInt(0);
int t = GetInt(0);
int m = GetInt(0);
int q = GetInt(0);
if (f == t)
{
answer(q, 0);
return;
}
int a;
if (m == 0)
{
a = go(t, FirstNeighbor(f), f);
}
else
{
a = go(t, SecondNeighbor(f), f);
}
answer(q, a);
}
int main()
{
N = NumberOfNodes();
ID = MyNodeId();
M = NumberOfStudents();
Q = NumberOfQueries();
int run = ID-1;
if (ID == 0)
{
master();
}
else
{
while (run < Q*2)
{
slave();
run += (N-1);
}
}
}
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 126 127 128 | #include <cstdio> #include "message.h" #include "kollib.h" int go(int A, int from, int prev) { int counter = 1; while (from != A) { int p = FirstNeighbor(from); if (p == prev) p = SecondNeighbor(from); prev = from; from = p; counter++; } return counter; } int N, ID, M, Q; void master() { int k = 1; int ans = 0; int answers[Q]; for (int i=0; i<Q; i++) { int f, t; f = QueryFrom(i+1); t = QueryTo(i+1); answers[i] = -1; PutInt(k, f); PutInt(k, t); PutInt(k, 0); PutInt(k, i); Send(k); k++; if (k == N) k = 1; PutInt(k, f); PutInt(k, t); PutInt(k, 1); PutInt(k, i); Send(k); k++; if (k == N) k = 1; } while (ans < Q*2) { int from = Receive(-1); int a = GetInt(from); int v = GetInt(from); // fprintf(stderr, "answer for %i is %i\n", a, v); if (answers[a] == -1 || answers[a] > v) answers[a] = v; ans++; } for (int i=0; i<Q; i++) printf("%i\n", answers[i]); } void answer(int q, int v) { PutInt(0, q); PutInt(0, v); Send(0); } void slave() { Receive(0); int f = GetInt(0); int t = GetInt(0); int m = GetInt(0); int q = GetInt(0); if (f == t) { answer(q, 0); return; } int a; if (m == 0) { a = go(t, FirstNeighbor(f), f); } else { a = go(t, SecondNeighbor(f), f); } answer(q, a); } int main() { N = NumberOfNodes(); ID = MyNodeId(); M = NumberOfStudents(); Q = NumberOfQueries(); int run = ID-1; if (ID == 0) { master(); } else { while (run < Q*2) { slave(); run += (N-1); } } } |
English