Tarango

"Shortest" pair of paths

Oct 22nd, 2015
257
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.12 KB | None | 0 0
  1. //============================================================================
  2. // Name        : ACM
  3. // Author      : Tarango Khan
  4. // Team        : BRACU Byteheads
  5. //============================================================================
  6.  
  7. #include <bits/stdc++.h>
  8. using namespace std;
  9. #define Size 22
  10. #define INF 99999999
  11.  
  12. int Set(int N,int pos){
  13.     return N = N | (1<<pos);
  14. }
  15.  
  16. bool Check(int N,int pos){
  17.     return (bool)(N & (1<<pos));
  18. }
  19.  
  20. struct Edge {
  21.     int v, w;
  22.     Edge(int vv, int c) {
  23.         v = vv;
  24.         w = c;
  25.     }
  26.     bool operator <(const Edge& other) const {
  27.         return w > other.w;
  28.     }
  29. };
  30.  
  31. priority_queue<Edge> pQ;
  32. int dist[Size];
  33. int vert, edge;
  34. vector<Edge> Graph[Size];
  35. bool taken[22];
  36. vector<int> sp;
  37. int DP[(1<<20)+5][21];
  38.  
  39. int dijkstra() {
  40.     dist[0] = 0;
  41.     pQ = priority_queue<Edge>();
  42.     dist[0] = 0;
  43.     pQ.push(Edge(0, 0));
  44.     while (!pQ.empty()) {
  45.         Edge cur = pQ.top();
  46.         pQ.pop();
  47.         int Sz = Graph[cur.v].size();
  48.         for (int i = 0; i < Sz; i++) {
  49.             Edge e = Graph[cur.v][i];
  50.             if(taken[e.v] == true) continue;
  51.             if (cur.w + e.w < dist[e.v]) {
  52.                 dist[e.v] = cur.w + e.w;
  53.                 pQ.push(Edge(e.v, dist[e.v]));
  54.             }
  55.         }
  56.     }
  57.     return dist[vert-1];
  58. }
  59.  
  60. int secondPath(int mask){
  61.     bool others = false;
  62.     for(int i = 0;i<=vert;i++){
  63.         dist[i]= INF;
  64.         taken[i] = false;
  65.     }
  66.     //Marking those nodes so that next shortest path doesn't include them;
  67.     for(int p = 1;p<vert-1;p++){
  68.         if(Check(mask,p) == true){
  69.             taken[p] = true;
  70.             others = true;
  71.         }
  72.     }
  73.     //For handling test cases where shortest path include only (src-dest) edge;
  74.     if(sp.size() != 0){
  75.         if(others == false){ //Means the previous path includes only  (src-dest) edge;
  76.             int Sz = Graph[0].size();
  77.             for(int i = 0;i<Sz;i++){
  78.                 if(Graph[0][i].v == vert-1 && Graph[0][i].w == sp[0]){
  79.                     Graph[0][i].w = INF;
  80.                     int ret = dijkstra();
  81.                     Graph[0][i].w = sp[0];
  82.                     return ret;
  83.                 }
  84.             }
  85.         }
  86.     }
  87.     return dijkstra();
  88. }
  89.  
  90. int call(int cur,int mask){
  91.     if(cur == vert-1){
  92.         //After successfully finding a path from src to dest,
  93.         //Searching the next shortest path using dijkstra;
  94.         return secondPath(mask);
  95.     }
  96.     if(DP[mask][cur] != -1) return DP[mask][cur];
  97.  
  98.     int Sz = Graph[cur].size();
  99.     int res = INF;
  100.     for(int i = 0;i<Sz;i++){
  101.         Edge e = Graph[cur][i];
  102.         if(Check(mask,e.v) == false){
  103.             int nMask = Set(mask,e.v);
  104.             int ret = call(e.v,nMask) + e.w;
  105.             res = min(res,ret);
  106.         }
  107.     }
  108.     return DP[mask][cur] = res;
  109. }
  110.  
  111. int main() {
  112.     int source,dest,w,cs = 0;;
  113.     while (scanf("%d %d",&vert,&edge) == 2) {
  114.         cs++;
  115.         if(vert == 0 && edge == 0) break;
  116.         sp.clear(); //sp includes only the edge cost of (src-dest);
  117.         for (int i = 0; i <= vert; i++) {
  118.             dist[i] = INF;
  119.             taken[i] = false;
  120.             Graph[i].clear();
  121.         }
  122.         for (int i = 0; i < edge; i++) {
  123.             scanf("%d %d %d", &source, &dest, &w);
  124.             Graph[source].push_back(Edge(dest, w));
  125.             if(source == 0 && dest == vert-1){
  126.                 sp.push_back(w);
  127.             }
  128.         }
  129.         sort(sp.begin(),sp.end());
  130.         memset(DP,-1,sizeof(DP));
  131.         int res = call(0,1);
  132.         if(res < INF){
  133.             printf("Instance #%d:  %d\n",cs,res);
  134.         }else{
  135.             printf("Instance #%d:  Not possible\n",cs);
  136.         }
  137.     }
  138.     return 0;
  139. }
Advertisement
Add Comment
Please, Sign In to add comment