Advertisement
Guest User

kkkkkkkkkk

a guest
Nov 15th, 2019
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.22 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define INF std::numeric_limits<int>::min()
  3. #define x first
  4. #define y second
  5. using namespace std;
  6.  
  7. int main(){
  8.     int qtd_fases;
  9.     cin >> qtd_fases;
  10.  
  11.     for(int u = 0; u < qtd_fases; u++){
  12.         int qtd_pontos;
  13.         cin >> qtd_pontos;
  14.  
  15.         int distancia[qtd_pontos][qtd_pontos], precursores[qtd_pontos];
  16.         pair<int, int> pontos[qtd_pontos];                              //Guarda o ponto
  17.         bool moedas[qtd_pontos];                                        //Guarda se tem moeda
  18.         unordered_map <int, list<pair<int, int>>> adjacencias;          //Guarda o adjacente + peso aresta
  19.  
  20.         for(int j = 0 ; j < qtd_pontos; j++) {
  21.             precursores[j] = -1;
  22.             moedas[j] = false;
  23.         }
  24.  
  25.         for(int j = 0; j < qtd_pontos; j++){
  26.             for(int k = 0; k < qtd_pontos; k++){
  27.                 distancia[j][k] = INF;
  28.             }
  29.         }
  30.  
  31.         for(int j = 0; j < qtd_pontos; j++){                            //Coleta as coordenadas dos pontos
  32.             int x, y;
  33.             cin >> x >> y;
  34.             pontos[j] = make_pair(x, y);
  35.         }
  36.  
  37.         int qtd_moedas;
  38.         cin >> qtd_moedas;
  39.         for(int j = 0; j < qtd_moedas; j++){
  40.             int posicao;
  41.             cin >> posicao;
  42.             moedas[posicao] = true;
  43.         }
  44.  
  45.         for(int j = 0; j < qtd_pontos; j++){
  46.             int qtd_alcancaveis;
  47.             cin >> qtd_alcancaveis;
  48.  
  49.             for(int i = 0; i < qtd_alcancaveis; i++){
  50.                 int aux;
  51.                 cin >> aux;
  52.                 int distancia = pow((pontos[j].x - pontos[aux].x),2) + pow((pontos[j].y - pontos[aux].y),2);
  53.                 if(moedas[aux] == true)
  54.                     adjacencias[j].push_back(make_pair(aux, -distancia));
  55.                 else
  56.                     adjacencias[j].push_back(make_pair(aux, distancia));
  57.             }
  58.         }
  59.         //INICIO DO BELLMAN-FORD
  60.         distancia[0][0] = 0;
  61.         for(int i = 1; i < qtd_pontos-1; i++){                          //Varre os vertices
  62.             for(int j = 0; j < qtd_pontos-1; i++){
  63.                 for(auto r: adjacencias[i]){                            //Varre a lista de adj. de cada vertice
  64.                     if(distancia[i-1][j] + r.y < distancia[i][r.x]){
  65.                         distancia[i][r.x] = distancia[i-1][j] + r.y;
  66.                         precursores[r.x] = i;
  67.                     }
  68.                 }
  69.             }
  70.         }
  71.         bool stop = false;
  72.         for(int i = 1; i < qtd_pontos && !stop; i++){               //Checa se ha loops
  73.             for(auto r: adjacencias[i]){
  74.                 if(distancia[qtd_pontos-1][i] > distancia[qtd_pontos-2][r.x] + r.y)
  75.                     stop = true;
  76.             }
  77.         }
  78.         if(stop == false){
  79.             int energia = 0;
  80.             /*for(int i = 1; i < qtd_pontos; i++){
  81.                 for(auto s : adjacencias[precursores[i]]){
  82.                     if(s.x == i) energia += s.y;
  83.                 }
  84.             }*/
  85.             cout << distancia[qtd_pontos-1][qtd_pontos-1] << " ";
  86.             for(int i = 0; i < qtd_pontos; i++) cout << precursores[i] << " ";
  87.         }
  88.         else cout << "LOOP" << endl;
  89.     }
  90.     return 0;
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement