Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <cmath>
- #include <cstring>
- #define MAX_P 102
- #define INF 0x3f3f3f3f
- struct p
- {
- int x, y, raio;
- }pontos[MAX_P];
- int grafo[MAX_P][MAX_P];
- bool visitado[MAX_P];
- int distancias[MAX_P];
- void ligarPontos(int n)
- {
- float distancia; // Distancia entre 2 pontos: d^2 = (x - x0)^2 + (y - y0)^2
- for(int i = 0; i < n; i++)
- {
- for(int j = 0; j < n; j++)
- {
- distancia = sqrt(pow(pontos[i].x - pontos[j].x, 2) + pow(pontos[i].y - pontos[j].y, 2));
- if(distancia <= pontos[i].raio)
- grafo[i][j] = (int)distancia; // Truncado
- }
- }
- }
- int dijkstra(int origem, int destino, int vertices)
- {
- int atual, minimo;
- for(int i = 0; i < vertices; i++)
- {
- visitado[i] = false;
- distancias[i] = INF;
- }
- distancias[origem] = 0;
- atual = origem;
- while(atual != destino)
- {
- for(int i = 0; i < vertices; i++)
- if(grafo[atual][i] != -1)
- if(distancias[atual] + grafo[atual][i] < distancias[i])
- distancias[i] = distancias[atual] + grafo[atual][i];
- minimo = INF + 1;
- visitado[atual] = true;
- for(int i = 0; i < vertices; i++)
- {
- if(distancias[i] < minimo && !visitado[i])
- {
- minimo = distancias[i];
- atual = i;
- }
- }
- if(minimo >= INF)
- return INF;
- }
- return distancias[destino];
- }
- int main()
- {
- int n, x, y, raio, consultas, origem, destino, distancia;
- while(scanf("%d", &n) && n)
- {
- for(int i = 0; i < n; i++)
- {
- scanf("%d %d %d", &x, &y, &raio);
- pontos[i].x = x;
- pontos[i].y = y;
- pontos[i].raio = raio;
- }
- memset(grafo, 0xff, sizeof(grafo));
- ligarPontos(n);
- scanf("%d", &consultas);
- for(int i = 0; i < consultas; i++)
- {
- scanf("%d %d", &origem, &destino);
- distancia = dijkstra(origem - 1, destino - 1, n);
- printf("%d\n", distancia >= INF ? -1 : distancia);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment