Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2013
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.81 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <list>
  4.  
  5. #define INFINITY 9999999
  6. #define NIL -1
  7.  
  8. using namespace std;
  9.  
  10. class Dijkstra;
  11. class Arc;
  12. class Vertex;
  13. class Graph;
  14.  
  15. class Arc
  16. {
  17. public:
  18.     int src;
  19.     int dst;
  20.     int weight;
  21.  
  22.     Arc (int _src, int _dst, int _weight)
  23.     {
  24.         src = _src;
  25.         dst = _dst;
  26.         weight = _weight;
  27.     }
  28.  
  29.     ~Arc ()
  30.     {
  31.         src = 0;
  32.         dst = 0;
  33.         weight = 0;
  34.     }
  35. };
  36.  
  37. class Vertex
  38. {
  39. public:
  40.     vector<Arc*> arcs;
  41.     Vertex ()
  42.     {
  43.         arcs = vector<Arc*>();
  44.     }
  45.  
  46.     ~Vertex ()
  47.     {
  48.         for (int i = 0; i < (int) arcs.size(); i++)
  49.         {
  50.             delete arcs[i];
  51.         }
  52.     }
  53. };
  54.  
  55. class Graph
  56. {
  57. public:
  58.     vector<Vertex*> vertices;
  59.     Graph()
  60.     {
  61.         vertices = vector<Vertex*>();
  62.     }
  63.  
  64.     void addVertex ()
  65.     {
  66.         Vertex* v = new Vertex();
  67.         vertices.push_back(v);
  68.     }
  69.  
  70.     void addArc(int _src, int _dst, int _weight)
  71.     {
  72.         Arc* a = new Arc(_src,_dst, _weight);
  73.         vertices[_src]->arcs.push_back(a);
  74.     }
  75.  
  76.     int w(int u, int v)
  77.     {
  78.         for (int i = 0; i < (int) vertices[u]->arcs.size(); i++)
  79.         {
  80.             if (vertices[u]->arcs[i]->dst == v)
  81.             {
  82.                 return vertices[u]->arcs[i]->weight;
  83.             }
  84.         }
  85.         return INFINITY;
  86.     }
  87.        
  88.     void printGraph()
  89.     {
  90.         for (int i = 0; i < (int) vertices.size(); i++)
  91.         {
  92.             for (int j = 0; j < (int) vertices[i]->arcs.size(); j++)
  93.             {
  94.                 cout << i+1 << " " << vertices[i]->arcs[j]->dst+1 << " " << vertices[i]->arcs[j]->weight << "\t";
  95.             }
  96.             cout << endl;
  97.         }
  98.     }
  99.  
  100.     ~Graph ()
  101.     {
  102.         for (int i = 0; i < (int) vertices.size(); i++)
  103.         {
  104.             delete vertices[i];
  105.         }
  106.     }
  107.  
  108. };
  109.  
  110.  
  111. class Dijkstra
  112. {
  113. public:
  114.     int* d;
  115.     int* pi;
  116.     list<int> Q;
  117.  
  118.     Dijkstra()
  119.     {
  120.  
  121.     }
  122.  
  123.     void shortest_paths(Graph* G, int s)
  124.     {
  125.         initialize(G,s);
  126.         Q = addVertices(G);
  127.         while (Q.size() != 0)
  128.         {
  129.             int u = extractCheapest(Q);
  130.             Q.remove(u);
  131.             if (d[u] == INFINITY)
  132.             {
  133.                 break;
  134.             }
  135.             for (int i = 0; i < (int) G->vertices[u]->arcs.size(); i++)
  136.             {
  137.                 int v = G->vertices[u]->arcs[i]->dst;
  138.                 relax(G,u,v);
  139.             }
  140.         }
  141.     }
  142.  
  143.  
  144.     void initialize(Graph* G, int s)
  145.     {
  146.         int size = G->vertices.size();
  147.         d = new int[size];
  148.         pi = new int[size];
  149.         for (int i = 0; i < size; i++)
  150.         {
  151.             d[i] = INFINITY;
  152.             pi[i] = NIL;
  153.         }
  154.         d[s] = 0;
  155.     }
  156.  
  157.     void relax(Graph* G, int u, int v)
  158.     {
  159.         int w = (d[u] + G->w(u,v));
  160.         if (d[v] > w)
  161.         {
  162.             d[v] = w;
  163.             pi[v] = u;
  164.         }
  165.     }
  166.  
  167.     list<int> addVertices(Graph* G)
  168.     {
  169.         list<int> q;
  170.         for (int i = 0; i < (int) G->vertices.size(); i++)
  171.         {
  172.             q.push_back(i);
  173.         }
  174.         return q;
  175.     }
  176.  
  177.     int extractCheapest(list<int> Q)
  178.     {
  179.         int minorDist = INFINITY;
  180.         int minorVertex = NIL;
  181.         list<int>::iterator it;
  182.         for (it = Q.begin(); it != Q.end(); it++)
  183.         {
  184.             int dist = d[(*it)];
  185.             if ( dist <= minorDist )
  186.             {
  187.                 minorDist = dist;
  188.                 minorVertex = (*it);
  189.             }
  190.         }
  191.         return minorVertex;
  192.     }
  193.    
  194.     void printOutput (int cnt, int _d)
  195.     {
  196.         cout << "Case " << cnt << ": Path =";
  197.         printRecursive(_d);
  198.         cout << "; ";
  199.         cout << d[_d] <<" second delay" << endl;
  200.     }
  201.  
  202.     void printRecursive(int _d)
  203.     {
  204.         if(pi[_d] == NIL)
  205.         {
  206.             cout << " " << _d + 1;
  207.         }
  208.         else
  209.         {
  210.             printRecursive(pi[_d]);
  211.             cout << " "<< _d + 1;
  212.         }
  213.     }
  214.  
  215.     ~Dijkstra()
  216.     {
  217.         delete [] d;
  218.         delete [] pi;
  219.     }
  220.  
  221. };
  222.  
  223. int main ()
  224. {
  225.     int NI;        
  226.     int NE;          
  227.     int weight;    
  228.     int v;        
  229.     int s;        
  230.     int d;        
  231.     int cnt = 0;  
  232.     while (cin >> NI)
  233.     {
  234.         if (NI != 0)
  235.         {
  236.             cnt++;
  237.             Graph* G = new Graph();
  238.             for (int u = 0; u < NI; u++)
  239.             {
  240.                 G->addVertex();
  241.                 cin >> NE;
  242.                 for (int j = 0; j < NE; j++)
  243.                 {
  244.                     cin >> v;
  245.                     cin >> weight;
  246.                     G->addArc(u,v-1,weight);
  247.                 }
  248.             }
  249.             cin >> s;
  250.             cin >> d;
  251.             Dijkstra* dijkstra = new Dijkstra();
  252.             dijkstra->shortest_paths(G,s-1);
  253.             dijkstra->printOutput(cnt,d-1);
  254.             delete G;
  255.             delete dijkstra;
  256.         }
  257.         else
  258.         {
  259.             cnt = 0;
  260.         }
  261.     }
  262.     return 0;
  263. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement