Advertisement
Guest User

Untitled

a guest
Mar 30th, 2015
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.95 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. const int NMAX = 100000;
  8. const int LOG = 17;
  9.  
  10. struct muchie {
  11.     int x, d;
  12.  
  13.     muchie (int x = 0, int d = 1):
  14.         x (x), d (d) {}
  15. };
  16.  
  17. int N, M, l, rad1, rad2;
  18. int t[2][NMAX + 1][LOG + 1];
  19. int dist[2][NMAX + 1], niv[2][NMAX + 1];
  20. bool viz[NMAX + 1];
  21.  
  22. vector <muchie> v[NMAX + 1];
  23.  
  24. void citire () {
  25.     int x, y, d;
  26.  
  27.     scanf ("%d%d", &N, &M);
  28.     for (int i = 1; i < N; ++i) {
  29.         scanf ("%d%d%d", &x, &y, &d);
  30.         v[x].push_back (muchie (y, d));
  31.         v[y].push_back (muchie (x, d));
  32.     }
  33. }
  34.  
  35. void dfs (int nod) {
  36.     viz[nod] = true;
  37.  
  38.     for (int i = 0; i < v[nod].size (); ++i) {
  39.         muchie fiu = v[nod][i];
  40.         if (!viz[fiu.x]) {
  41.             dist[l][fiu.x] = dist[l][nod] + fiu.d;
  42.  
  43.             dfs (fiu.x);
  44.         }
  45.     }
  46.  
  47.     viz[nod] = false;
  48. }
  49.  
  50. void diametru () {
  51.     int dmax = -1;
  52.  
  53.     l = 0;
  54.     dfs (1);
  55.     for (int i = 1; i <= N; ++i) {
  56.         if (dist[0][i] > dmax) {
  57.             dmax = dist[0][i];
  58.             rad1 = i;
  59.         }
  60.     }
  61.  
  62.     dmax = -1;
  63.     dist[0][rad1] = 0;
  64.     l = 0;
  65.     dfs (rad1);
  66.     for (int i = 1; i <= N; ++i) {
  67.         if (dist[0][i] > dmax) {
  68.             dmax = dist[0][i];
  69.             rad2 = i;
  70.         }
  71.     }
  72.  
  73.     l = 1;
  74.     dfs (rad2);
  75. }
  76.  
  77. void calcT (int nod) {
  78.     viz[nod] = true;
  79.  
  80.     for (int i = 1; (1 << i) <= niv[l][nod]; ++i)
  81.         t[l][nod][i] = t[l][t[l][nod][i - 1]][i - 1];
  82.  
  83.     for (int i = 0; i < v[nod].size (); ++i) {
  84.         muchie fiu = v[nod][i];
  85.         if (!viz[fiu.x]) {
  86.             niv[l][fiu.x] = niv[l][nod] + 1;
  87.             t[l][fiu.x][0] = nod;
  88.  
  89.             calcT (fiu.x);
  90.         }
  91.     }
  92.  
  93.     viz[nod] = false;
  94. }
  95.  
  96. void smenulDeLaStramosi () {
  97.     l = 0;
  98.     calcT (rad1);
  99.     l = 1;
  100.     calcT (rad2);
  101. }
  102.  
  103. void sol (int nod, int d, int l) {
  104.     if (d <= ((dist[l][nod] - dist[l][t[l][nod][0]])))
  105.         printf ("%d %d %d\n", nod, t[l][nod][0], d);
  106.     else {
  107.         int i = 0, p;
  108.         while ((1 << i) <= niv[l][nod]) {
  109.             p = t[l][nod][i];
  110.  
  111.             if (dist[l][nod] - dist[l][p] > d) {
  112.                 --i;
  113.                 p = t[l][nod][i];
  114.                 break;
  115.             } else
  116.                 ++i;
  117.         }
  118.  
  119.         if (d == (dist[l][nod] - dist[l][p]))
  120.             printf ("%d %d %d\n", p, nod, 0);
  121.         else
  122.             sol (p, d - (dist[l][nod] - dist[l][p]), l);
  123.     }
  124. }
  125.  
  126. void rezolva () {
  127.     int x, d;
  128.  
  129.     for (int i = 1; i <= M; ++i) {
  130.         scanf ("%d%d", &x, &d);
  131.  
  132.         if (dist[0][x] >= d)
  133.             sol (x, d, 0);
  134.         else if (dist[1][x] >= d)
  135.             sol (x, d, 1);
  136.         else
  137.             printf ("'Am festelit smerenghelul'\n");
  138.     }
  139. }
  140.  
  141. int main () {
  142.     freopen ("hacker2.in", "r", stdin);
  143.     freopen ("hacker2.out", "w", stdout);
  144.  
  145.     citire ();
  146.     diametru ();
  147.     smenulDeLaStramosi ();
  148.  
  149.     rezolva ();
  150.  
  151.     return 0;
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement