Advertisement
Guest User

Untitled

a guest
Jun 18th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.83 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. #include <fstream>
  5.  
  6. #define INF (1 << 29)
  7.  
  8. using namespace std;
  9.  
  10. struct arista{ int nodo, costo, cuadra; };
  11.  
  12. struct grafo{
  13.     vector < vector <arista> > adj;
  14.     vector < int > aRec;
  15.     int nodos, aristas;
  16.  
  17.     void leer(istream &in){
  18.         in >> nodos >> aristas;
  19.  
  20.         adj.resize(nodos + 1);
  21.         aRec.resize(aristas + 1);
  22.  
  23.         for(int i = 1; i <= aristas; i++){
  24.             int d, h, k;
  25.  
  26.             in >> d >> h >> k;
  27.  
  28.             adj[d].push_back({h, k, i});
  29.         }
  30.     }
  31.  
  32.     void DPCaminos(const int &nodo, vector <int> &cRc, const vector < vector < arista > > &subAdj, const int &arSec){
  33.         for(int i = 0; i < int(subAdj[nodo].size()); i++){
  34.             DPCaminos(subAdj[nodo][i].nodo, cRc, subAdj, subAdj[nodo][i].cuadra);
  35.  
  36.             if(arSec != (-1))
  37.                 aRec[arSec] += (subAdj[nodo][i].cuadra);
  38.         }
  39.  
  40.         if((arSec != -1) && !int(subAdj[nodo].size())) aRec[arSec] += 1;
  41.     }
  42.  
  43.     void dijkstra(const int &inicial){
  44.         vector <int> d((nodos + 1), INF), cRc((nodos + 1), 1);
  45.         vector <arista> p(nodos + 1);
  46.         vector < vector < arista > > subAdj(nodos + 1);
  47.  
  48.         d[inicial] = 0;
  49.         p[inicial] = {0, 0, 0};
  50.         p[0] = {-1, -1, -1};
  51.  
  52.         priority_queue < pair <int, int> > pq;
  53.  
  54.         pq.push({0, inicial});
  55.  
  56.         while(int(pq.size())){
  57.             int nodo = pq.top().second;
  58.             int dist = (pq.top().first * (-1));
  59.  
  60.             pq.pop();
  61.  
  62.             for(int i = 0; i < int(adj[nodo].size()); i++){
  63.                 int nV = adj[nodo][i].nodo;
  64.                 int cV = adj[nodo][i].costo;
  65.                 int caV = adj[nodo][i].cuadra;
  66.  
  67.                 if((dist + cV) < d[nV]){
  68.                     d[nV] = (dist + cV);
  69.  
  70.                     p[nV] = {nodo, cV, caV};
  71.  
  72.                     pq.push({(d[nV] * (-1)), nV});
  73.                 }
  74.             }
  75.         }
  76.  
  77.         for(int i = 1; i <= nodos; i++)
  78.             if(i != inicial)
  79.                 subAdj[p[i].nodo].push_back({i, p[i].costo, p[i].cuadra});
  80.  
  81.         DPCaminos(inicial, cRc, subAdj, (-1));
  82.  
  83.         /************************BORRAR*************************/
  84.         /**********/for(int i = 1; i <= aristas; i++)/**********/
  85.         /**********/    cout << aRec[i] << " ";      /**********/
  86.         /**********/cout << "\n";                    /**********/
  87.         /************************BORRAR*************************/
  88.     }
  89.  
  90.     void resolver(istream &in, ostream &out){
  91.         leer(in);
  92.  
  93.         for(int i = 1; i <= nodos; i++)
  94.             dijkstra(i);
  95.     }
  96. };
  97.  
  98. int main()
  99. {
  100.     ifstream in("congestion.in", fstream::in);
  101.     ofstream out("congestion.out", fstream::out);
  102.  
  103.     grafo g;
  104.  
  105.     g.resolver(in, cout);
  106.  
  107.     in.close();
  108.     out.close();
  109.  
  110.     return 0;
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement