#include "kollib.h" #include "message.h" #include <vector> #include <iostream> #include <set> using namespace std; int calculatePath(int from, int to, int number, set<int> path){ path.insert(from); if (from == to) return number; int firstN = FirstNeighbor(from); int secondN = SecondNeighbor(from); if (path.find(firstN)==path.end()){ return calculatePath(firstN, to, number+1, path); }else { return calculatePath(secondN, to, number+1, path); } } int main() { set<int> path1; set<int> path2; int incr; if (NumberOfQueries() % NumberOfNodes()==0) incr = NumberOfQueries() / NumberOfNodes(); else incr = NumberOfQueries() / NumberOfNodes() + 1; for (int i = MyNodeId()*incr+1; i <= MyNodeId()*incr+incr; i++) { if (i>NumberOfQueries()) break; int from = QueryFrom(i); int to = QueryTo(i); int minutes = 0; if (from != to){ path1.insert(from); path2.insert(from); int x = calculatePath(FirstNeighbor(from), to, 1, path1); int y = calculatePath(SecondNeighbor(from), to, 1, path2); minutes = min(x, y); } PutInt(0, minutes); path1.erase(path1.begin(), path1.end()); path2.erase(path2.begin(), path2.end()); } Send(0); if (MyNodeId() == 0){ vector<vector<int> > odp(NumberOfNodes()); int licznik = 1; while(true){ int instancja = Receive(-1); for (int i=0 ; i<incr ; i++){ int nr = GetInt(instancja); odp[instancja].push_back(nr); licznik++; } if (licznik == NumberOfQueries()) break; } licznik = 1; for (int k=0 ; k<odp.size() ; k++){ vector<int> v = odp[k]; for (int p = 0 ; p < v.size() ; p++){ cout<<v[p]<<endl; licznik++; if (licznik == NumberOfQueries()) break; } } } 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 | #include "kollib.h" #include "message.h" #include <vector> #include <iostream> #include <set> using namespace std; int calculatePath(int from, int to, int number, set<int> path){ path.insert(from); if (from == to) return number; int firstN = FirstNeighbor(from); int secondN = SecondNeighbor(from); if (path.find(firstN)==path.end()){ return calculatePath(firstN, to, number+1, path); }else { return calculatePath(secondN, to, number+1, path); } } int main() { set<int> path1; set<int> path2; int incr; if (NumberOfQueries() % NumberOfNodes()==0) incr = NumberOfQueries() / NumberOfNodes(); else incr = NumberOfQueries() / NumberOfNodes() + 1; for (int i = MyNodeId()*incr+1; i <= MyNodeId()*incr+incr; i++) { if (i>NumberOfQueries()) break; int from = QueryFrom(i); int to = QueryTo(i); int minutes = 0; if (from != to){ path1.insert(from); path2.insert(from); int x = calculatePath(FirstNeighbor(from), to, 1, path1); int y = calculatePath(SecondNeighbor(from), to, 1, path2); minutes = min(x, y); } PutInt(0, minutes); path1.erase(path1.begin(), path1.end()); path2.erase(path2.begin(), path2.end()); } Send(0); if (MyNodeId() == 0){ vector<vector<int> > odp(NumberOfNodes()); int licznik = 1; while(true){ int instancja = Receive(-1); for (int i=0 ; i<incr ; i++){ int nr = GetInt(instancja); odp[instancja].push_back(nr); licznik++; } if (licznik == NumberOfQueries()) break; } licznik = 1; for (int k=0 ; k<odp.size() ; k++){ vector<int> v = odp[k]; for (int p = 0 ; p < v.size() ; p++){ cout<<v[p]<<endl; licznik++; if (licznik == NumberOfQueries()) break; } } } return 0; } |