/*
* Copyright (C) 2014 Paweł Widera
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details:
* http://www.gnu.org/licenses/gpl.html
*/
#include "kollib.h"
#include "message.h"
#include <vector>
#include <cmath>
#include <iostream>
using namespace std;
// find the message propagation time
int find(int from, int to) {
int first = FirstNeighbor(from);
int first_previous = from;
int second = SecondNeighbor(from);
int second_previous = from;
int time = 1;
if (from == to) {
return 0;
}
while (first != to && second != to) {
// move to the first neighbour
if (FirstNeighbor(first) == first_previous) {
first_previous = first;
first = SecondNeighbor(first);
} else {
first_previous = first;
first = FirstNeighbor(first);
}
// move to the second neighbour
if (FirstNeighbor(second) == second_previous) {
second_previous = second;
second = SecondNeighbor(second);
} else {
second_previous = second;
second = FirstNeighbor(second);
}
++time;
}
return time;
}
int main() {
int n = NumberOfQueries();
int k = NumberOfNodes();
int range = ceil(n / float(k));
int start = MyNodeId() * range + 1;
int end = min((MyNodeId() + 1) * range + 1, n + 1);
if (MyNodeId() > 0) {
PutInt(0, start);
PutInt(0, end);
for (int i = start; i < end; ++i) {
PutInt(0, find(QueryFrom(i), QueryTo(i)));
}
Send(0);
}
if (MyNodeId() == 0) {
vector<int> times(n);
for (int i = start; i < end; ++i) {
times[i - 1] = find(QueryFrom(i), QueryTo(i));
}
for (int i = 1; i < k; ++i) {
int node = Receive(-1);
start = GetInt(node);
end = GetInt(node);
for (int j = start; j < end; ++j) {
times[j - 1] = GetInt(node);
}
}
ios::sync_with_stdio (false);
for (auto time : times) {
cout << time << endl;
}
}
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 | /* * Copyright (C) 2014 Paweł Widera * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details: * http://www.gnu.org/licenses/gpl.html */ #include "kollib.h" #include "message.h" #include <vector> #include <cmath> #include <iostream> using namespace std; // find the message propagation time int find(int from, int to) { int first = FirstNeighbor(from); int first_previous = from; int second = SecondNeighbor(from); int second_previous = from; int time = 1; if (from == to) { return 0; } while (first != to && second != to) { // move to the first neighbour if (FirstNeighbor(first) == first_previous) { first_previous = first; first = SecondNeighbor(first); } else { first_previous = first; first = FirstNeighbor(first); } // move to the second neighbour if (FirstNeighbor(second) == second_previous) { second_previous = second; second = SecondNeighbor(second); } else { second_previous = second; second = FirstNeighbor(second); } ++time; } return time; } int main() { int n = NumberOfQueries(); int k = NumberOfNodes(); int range = ceil(n / float(k)); int start = MyNodeId() * range + 1; int end = min((MyNodeId() + 1) * range + 1, n + 1); if (MyNodeId() > 0) { PutInt(0, start); PutInt(0, end); for (int i = start; i < end; ++i) { PutInt(0, find(QueryFrom(i), QueryTo(i))); } Send(0); } if (MyNodeId() == 0) { vector<int> times(n); for (int i = start; i < end; ++i) { times[i - 1] = find(QueryFrom(i), QueryTo(i)); } for (int i = 1; i < k; ++i) { int node = Receive(-1); start = GetInt(node); end = GetInt(node); for (int j = start; j < end; ++j) { times[j - 1] = GetInt(node); } } ios::sync_with_stdio (false); for (auto time : times) { cout << time << endl; } } return 0; } |
English