Gabriel_Duarte

Problema 1539 URI

Apr 21st, 2014
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.85 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cmath>
  3. #include <cstring>
  4.  
  5. #define MAX_P 102
  6. #define INF 0x3f3f3f3f
  7.  
  8.  
  9. struct p
  10. {
  11.     int x, y, raio;
  12.    
  13. }pontos[MAX_P];
  14.  
  15. int grafo[MAX_P][MAX_P];
  16. bool visitado[MAX_P];
  17. int distancias[MAX_P];
  18.  
  19. void ligarPontos(int n)
  20. {
  21.     float distancia;  // Distancia entre 2 pontos:  d^2 = (x - x0)^2 + (y - y0)^2
  22.     for(int i = 0; i < n; i++)
  23.     {
  24.         for(int j = 0; j < n; j++)
  25.         {
  26.             distancia = sqrt(pow(pontos[i].x - pontos[j].x, 2) + pow(pontos[i].y - pontos[j].y, 2));       
  27.             if(distancia <= pontos[i].raio)
  28.                 grafo[i][j] = (int)distancia; // Truncado
  29.            
  30.         }
  31.     }
  32. }
  33.  
  34. int dijkstra(int origem, int destino, int vertices)
  35. {
  36.     int atual, minimo;
  37.    
  38.     for(int i = 0; i < vertices; i++)
  39.     {
  40.         visitado[i] = false;
  41.         distancias[i] = INF;
  42.     }
  43.    
  44.     distancias[origem] = 0;
  45.     atual = origem;
  46.    
  47.     while(atual != destino)
  48.     {  
  49.         for(int i = 0; i < vertices; i++)
  50.             if(grafo[atual][i] != -1)
  51.                 if(distancias[atual] + grafo[atual][i] < distancias[i])
  52.                     distancias[i] = distancias[atual] + grafo[atual][i];
  53.        
  54.         minimo = INF + 1;
  55.         visitado[atual] = true;
  56.         for(int i = 0; i < vertices; i++)
  57.         {
  58.             if(distancias[i] < minimo && !visitado[i])
  59.             {
  60.                 minimo = distancias[i];
  61.                 atual = i;
  62.             }
  63.         }
  64.         if(minimo >= INF)
  65.             return INF;
  66.     }
  67.     return distancias[destino];
  68. }
  69.  
  70. int main()
  71. {
  72.     int n, x, y, raio, consultas, origem, destino, distancia;
  73.     while(scanf("%d", &n) && n)
  74.     {
  75.         for(int i = 0; i < n; i++)
  76.         {
  77.             scanf("%d %d %d", &x, &y, &raio);
  78.             pontos[i].x = x;
  79.             pontos[i].y = y;
  80.             pontos[i].raio = raio;
  81.         }
  82.        
  83.         memset(grafo, 0xff, sizeof(grafo));    
  84.         ligarPontos(n);
  85.        
  86.         scanf("%d", &consultas);
  87.         for(int i = 0; i < consultas; i++)
  88.         {
  89.             scanf("%d %d", &origem, &destino);
  90.             distancia = dijkstra(origem - 1, destino - 1, n);          
  91.             printf("%d\n", distancia >= INF ? -1 : distancia);
  92.         }
  93.     }
  94.     return 0;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment