Advertisement
chaosagent

Broken Special Vertex

Sep 2nd, 2015
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.09 KB | None | 0 0
  1. #include <algorithm>
  2. #include <cstdio>
  3. #include <iostream>
  4. #include <queue>
  5. #include <vector>
  6. #include <assert.h>
  7.  
  8. using namespace std;
  9.  
  10. struct Node {
  11.     int i;
  12.     int dist;
  13.     Node *parent;
  14.     vector<Node *> nexts;
  15. };
  16.  
  17. int main() {
  18.     int n;
  19.     scanf("%d", &n);
  20.     vector<Node> nodes(n);
  21.     for (int i = 0; i < n - 1; i++) {
  22.         int a, b;
  23.         scanf("%d %d", &a, &b);
  24.         a -= 1;
  25.         b -= 1;
  26.         nodes[a].nexts.push_back(&nodes[b]);
  27.         nodes[b].nexts.push_back(&nodes[a]);
  28.     }
  29.     for (int i = 0; i < n; i++) {
  30.         nodes[i].i = i;
  31.     }
  32.     queue<Node *> bfs;
  33.     bfs.push(&nodes[0]);
  34.     Node *prevpopped;
  35.     while (bfs.size()) {
  36.         for (Node *node : bfs.front()->nexts) {
  37.             if (node != bfs.front()->parent) {
  38.                 node->parent = bfs.front();
  39.                 bfs.push(node);
  40.             }
  41.         }
  42.         prevpopped = bfs.front();
  43.         bfs.pop();
  44.     }
  45.     Node *u = prevpopped;
  46.     u->parent = 0;
  47.     u->dist = 0;
  48.     bfs.push(u);
  49.     while (bfs.size()) {
  50.         for (Node *node : bfs.front()->nexts) {
  51.             if (node != bfs.front()->parent) {
  52.                 node->dist = bfs.front()->dist + 1;
  53.                 node->parent = bfs.front();
  54.                 bfs.push(node);
  55.             }
  56.         }
  57.         prevpopped = bfs.front();
  58.         bfs.pop();
  59.     }
  60.     Node *v = prevpopped;
  61.     int diameter = v->dist + 1;
  62.     Node *root = v;
  63.     for (int i = 0; i < diameter / 2; i++) {
  64.         root = root->parent;
  65.     }
  66.     root->parent = 0;
  67.     root->dist = 0;
  68.     bfs.push(root);
  69.     while (bfs.size()) {
  70.         for (Node *node : bfs.front()->nexts) {
  71.             node->dist = bfs.front()->dist + 1;
  72.             node->parent = bfs.front();
  73.             assert(find(node->nexts.begin(), node->nexts.end(), node->parent) != node->nexts.end());
  74.             node->nexts.erase(find(node->nexts.begin(), node->nexts.end(), node->parent));
  75.             bfs.push(node);
  76.         }
  77.         bfs.pop();
  78.     }
  79.     int feedback;
  80.     Node *prevpreprocnode;
  81.     Node *currnode = root;
  82.     feedback = root->i;
  83.     int queries = 0;
  84.     bool hitbottom = false;
  85.     vector<int> answers(n, -2);
  86.     while (feedback != -1) {
  87.         if (&nodes[feedback] != currnode->parent && !hitbottom) {
  88.             currnode = &nodes[feedback];
  89.             prevpreprocnode = currnode;
  90.             while (currnode->nexts.size() == 1) {
  91.                 currnode = currnode->nexts[0];
  92.             }
  93.  
  94.             if (currnode->nexts.size() == 0) {
  95.                 hitbottom = true;
  96.                 continue;
  97.             }
  98.  
  99.             if (answers[currnode->i] == -2) {
  100.                 printf("%d\n", currnode->i + 1);
  101.                 fflush(stdout);
  102.                 scanf("%d", &feedback);
  103.                 feedback -= 1;
  104.                 answers[currnode->i] = feedback;
  105.                 assert(currnode->i != answers[currnode->i]);
  106.                 assert(feedback == -1 || currnode->i != answers[answers[currnode->i]]);
  107.                 queries++;
  108.             } else {
  109.                 feedback = answers[currnode->i];
  110.             }
  111.         } else {
  112.             assert(hitbottom || nodes[feedback].nexts.size() == 1);
  113.             assert(hitbottom || (answers[currnode->i] == currnode->parent->i && answers[prevpreprocnode->parent->i] == prevpreprocnode->i));
  114.             vector<Node *> nodechain;
  115.             Node *tosearch = hitbottom ? currnode : currnode->parent;
  116.             vector<bool> innodechain(n, false);
  117.             while (tosearch != prevpreprocnode->parent) {
  118.                 nodechain.push_back(tosearch);
  119.                 innodechain[tosearch->i] = true;
  120.                 tosearch = tosearch->parent;
  121.             }
  122.             int rangebegin = 0;
  123.             int rangeend = nodechain.size();
  124.             while (true) {
  125.                 assert(rangebegin != rangeend);
  126.                 int tochecki = rangebegin + (rangeend - rangebegin) / 2;
  127.                 assert(tochecki != rangeend);
  128.                 if (answers[nodechain[tochecki]->i] == -2) {
  129.                     printf("%d\n", nodechain[tochecki]->i + 1);
  130.                     fflush(stdout);
  131.                     scanf("%d", &feedback);
  132.                     feedback -= 1;
  133.                     answers[nodechain[tochecki]->i] = feedback;
  134.                     assert(currnode->i != answers[currnode->i]);
  135.                     assert(feedback == -1 || currnode->i != answers[answers[currnode->i]]);
  136.                     queries++;
  137.                 } else {
  138.                     feedback = answers[nodechain[tochecki]->i];
  139.                 }
  140.                 if (feedback == -1) {
  141.                     return 0;
  142.                 } else if (tochecki - 1 >= rangebegin && feedback == nodechain[tochecki - 1]->i) {
  143.                     rangeend = tochecki;
  144.                 } else if (tochecki + 1 < rangeend && feedback == nodechain[tochecki + 1]->i) {
  145.                     rangebegin = tochecki + 1;
  146.                 } else {
  147.                     //assert(innodechain[feedback] || innodechain[nodes[feedback].parent->i]);
  148.                 }
  149.             }
  150.         }
  151.     }
  152.     return 0;
  153. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement