Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <stdio.h>
- #include <vector>
- #include <queue>
- #include <map>
- #define ii make_pair
- using namespace std;
- struct Grafo
- {
- vector <vector <pair<int, int> > > Adj;
- vector <int> d;
- map<int, int> idNodo;
- int id(int nivel, int ki)
- {
- int num = nivel*100 + ki;
- if(idNodo[num])
- return idNodo[num];
- idNodo[num] = idNodo.size();
- Adj.push_back(vector <pair<int, int> > ());
- return idNodo.size();
- }
- void dijkstra(int n)
- {
- priority_queue<pair<int, int>, vector <pair<int, int> >, greater <pair<int, int> > > pq;
- pq.push(ii(0, n));
- int v;
- d[n] = 0;
- while(pq.size())
- {
- n = pq.top().second;
- v = pq.top().first;
- pq.pop();
- for(int i=0; i<Adj[n].size(); i++)
- {
- if(d[n]+Adj[n][i].second < d[Adj[n][i].first])
- {
- d[Adj[n][i].first] = d[n] + Adj[n][i].second;
- pq.push(ii(d[Adj[n][i].first], Adj[n][i].first));
- }
- }
- }
- }
- void leer()
- {
- Adj.push_back(vector <pair<int, int> > ());
- char asterisco;
- int n;
- cin >> n;
- for(int i=1; i<=n; i++)
- {
- if(i > 1)
- cin >> asterisco;
- int k;
- cin >> k;
- for(int j=1; j<=k; j++)
- {
- int a, b;
- cin >> a;
- while(a)
- {
- cin >> b;
- int nodoPadre = id(i-1, a);
- int nodoHijo = id(i, j);
- Adj[nodoPadre].push_back(make_pair(nodoHijo, b));
- cin >> a;
- }
- }
- }
- d = vector <int> (Adj.size(), 999999999);
- dijkstra(1);
- int minCosto = 999999999;
- for(int i=1; i<Adj.size(); i++)
- if(Adj[i].size() == 0) ///Los del ultimo nivel no tienen hijos XD
- minCosto = min(minCosto, d[i]);
- cout << minCosto << endl;
- }
- };
- int main()
- {
- Grafo g;
- g.leer();
- return 0;
- }
Add Comment
Please, Sign In to add comment