GastonFontenla

Untitled

Sep 30th, 2018
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.47 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. #include <bitset>
  5.  
  6. using namespace std;
  7.  
  8. #define Par pair<ll, ll>
  9. #define ll long long
  10. #define TB(n, bit) (n |= (1 << bit))
  11. #define INF (1LL << 60)
  12.  
  13. class Tripla
  14. {
  15. public:
  16.     int costo, nodo, bit;
  17.     Tripla(int _costo, int _nodo, int _bit);
  18. };
  19.  
  20. Tripla::Tripla(int _costo, int _nodo, int _bit)
  21. {
  22.     costo = _costo;
  23.     nodo = _nodo;
  24.     bit = _bit;
  25. }
  26.  
  27. bool operator<(const Tripla &a, const Tripla &b)
  28. {
  29.     return a.costo > b.costo;
  30. }
  31.  
  32. struct Grafo
  33. {
  34.     vector <vector <Par> > adj;
  35.     vector <vector <ll> > d;
  36.     vector <ll> fish;
  37.     int n, m, k;
  38.  
  39.     void Dijkstra()
  40.     {
  41.         priority_queue<Tripla> pq;
  42.  
  43.         d[fish[1]][1] = 0;
  44.         pq.push(Tripla(0, 1, fish[1]));
  45.  
  46.         while(pq.size())
  47.         {
  48.             Tripla t = pq.top();
  49.             pq.pop();
  50.  
  51.             for(int i=0; i<adj[t.nodo].size(); i++)
  52.             {
  53.                 int vecino = adj[t.nodo][i].second;
  54.                 int bit = t.bit | fish[vecino];
  55.                 int dist = t.costo + adj[t.nodo][i].first;
  56.  
  57.                 if(d[bit][vecino] > dist)
  58.                 {
  59.                     d[bit][vecino] = dist;
  60.                     pq.push(Tripla(dist, vecino, bit));
  61.                 }
  62.             }
  63.         }
  64.  
  65.         ll target = (1 << k)-1;
  66.         ll resultado = INF;
  67.  
  68.         for(int i=0; i<d.size(); i++)
  69.         {
  70.             for(int j=i; j<d.size(); j++)
  71.             {
  72.                 ll combinado = i | j;
  73.                 ll dist = max(d[i][n], d[j][n]);
  74.  
  75.                 if(combinado == target)
  76.                     resultado = min(resultado, dist);
  77.             }
  78.         }
  79.  
  80.         cout << resultado << endl;
  81.     }
  82.  
  83.     void leer()
  84.     {
  85.         cin >> n >> m >> k;
  86.  
  87.         adj.resize(n+1);
  88.         d = vector <vector <ll> > ((1 << k)+1, vector <ll> (n+1, INF));
  89.         fish = vector <ll> (n+1, 0);
  90.  
  91.         for(int i=0; i<n; i++)
  92.         {
  93.             int cant, id;
  94.             cin >> cant;
  95.             for(int j=0; j<cant; j++)
  96.             {
  97.                 cin >> id;
  98.                 TB(fish[i+1], id-1);
  99.             }
  100.         }
  101.  
  102.         for(int i=0; i<m; i++)
  103.         {
  104.             int desde, hacia, costo;
  105.             cin >> desde >> hacia >> costo;
  106.             adj[desde].push_back({costo, hacia});
  107.             adj[hacia].push_back({costo, desde});
  108.         }
  109.  
  110.         Dijkstra();
  111.     }
  112.  
  113. };
  114.  
  115. int main()
  116. {
  117.     Grafo g;
  118.     g.leer();
  119.  
  120.     return 0;
  121. }
Add Comment
Please, Sign In to add comment