GastonFontenla

Timus: 1210 - Kind Spirits

Jun 5th, 2016
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.24 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <vector>
  4. #include <queue>
  5. #include <map>
  6. #define ii make_pair
  7.  
  8. using namespace std;
  9.  
  10. struct Grafo
  11. {
  12.     vector <vector <pair<int, int> > > Adj;
  13.     vector <int> d;
  14.     map<int, int> idNodo;
  15.  
  16.     int id(int nivel, int ki)
  17.     {
  18.         int num = nivel*100 + ki;
  19.         if(idNodo[num])
  20.             return idNodo[num];
  21.         idNodo[num] = idNodo.size();
  22.         Adj.push_back(vector <pair<int, int> > ());
  23.         return idNodo.size();
  24.     }
  25.  
  26.     void dijkstra(int n)
  27.     {
  28.         priority_queue<pair<int, int>, vector <pair<int, int> >, greater <pair<int, int> > > pq;
  29.         pq.push(ii(0, n));
  30.         int v;
  31.         d[n] = 0;
  32.         while(pq.size())
  33.         {
  34.             n = pq.top().second;
  35.             v = pq.top().first;
  36.             pq.pop();
  37.  
  38.             for(int i=0; i<Adj[n].size(); i++)
  39.             {
  40.                 if(d[n]+Adj[n][i].second < d[Adj[n][i].first])
  41.                 {
  42.                     d[Adj[n][i].first] = d[n] + Adj[n][i].second;
  43.                     pq.push(ii(d[Adj[n][i].first], Adj[n][i].first));
  44.                 }
  45.             }
  46.         }
  47.     }
  48.  
  49.     void leer()
  50.     {
  51.         Adj.push_back(vector <pair<int, int> > ());
  52.         char asterisco;
  53.         int n;
  54.         cin >> n;
  55.         for(int i=1; i<=n; i++)
  56.         {
  57.             if(i > 1)
  58.                 cin >> asterisco;
  59.  
  60.             int k;
  61.             cin >> k;
  62.             for(int j=1; j<=k; j++)
  63.             {
  64.                 int a, b;
  65.                 cin >> a;
  66.  
  67.                 while(a)
  68.                 {
  69.                     cin >> b;
  70.  
  71.                     int nodoPadre = id(i-1, a);
  72.                     int nodoHijo = id(i, j);
  73.  
  74.                     Adj[nodoPadre].push_back(make_pair(nodoHijo, b));
  75.  
  76.                     cin >> a;
  77.                 }
  78.             }
  79.         }
  80.  
  81.         d = vector <int> (Adj.size(), 999999999);
  82.  
  83.         dijkstra(1);
  84.  
  85.         int minCosto = 999999999;
  86.  
  87.         for(int i=1; i<Adj.size(); i++)
  88.             if(Adj[i].size() == 0) ///Los del ultimo nivel no tienen hijos XD
  89.                 minCosto = min(minCosto, d[i]);
  90.  
  91.         cout << minCosto << endl;
  92.     }
  93. };
  94.  
  95. int main()
  96. {
  97.     Grafo g;
  98.     g.leer();
  99.     return 0;
  100. }
Add Comment
Please, Sign In to add comment