Advertisement
saske_7

uva 10801.cpp

Jan 14th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.19 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define bound(x,y , i , j) x >= 0 && x < i && y >= 0 && y < j
  6. #define mp make_pair
  7. #define pb push_back
  8. #define pii pair<int , int>
  9. #define M 100
  10. #define rep(i , n) for(i = 0 ; i< n ;i++ )
  11. #define repi(i , n ) for(i =1  ; i<= n ; i++ )
  12. #define mem(x , y ) memset(x , y , sizeof x )
  13. #define mx 5000000
  14. #define ff first
  15. #define ss second
  16. #define sf(x)  scanf("%d", &x ) ;
  17. #define ___  printf("\n");
  18. typedef long long ll ;
  19. //int dx[] = { -1 ,+1, 0 , 0 , -1 , -1  , 1 , 1 };
  20. //int dy[] = { 0 , 0, +1, -1  , +1 , -1 , 1 , -1 };
  21.  
  22. //int dx[] = { 1 , 1, 2 , 2  , -1 , -1 , -2 , -2 }; // knight direction
  23. //int dy[] = { 2 , -2, +1, -1 ,2 , -2 , 1 , -1 };
  24.  
  25. vector<int> g[M+5][M+5], lift[101] ;
  26. vector<int > cost[M+5][M+5] ;
  27.  
  28. int dis[5][105][105]  , arr[10000] , temp[10000];
  29.  
  30.  
  31. struct make{
  32.   int t , u ,  d  , w ;
  33.     make() {} ;
  34.     make(int a , int b ,int c , int k ){
  35.     t =  a;
  36.     u =  b ;
  37.     d = c ;
  38.     w = k ;
  39.  
  40.   } ;
  41.   bool operator<(make x ) const { return w > x.w ;     }
  42.  
  43. };
  44.  
  45. void clr(){
  46. int i, j , k ;
  47.     rep(i , 5 )rep(j , 102) {
  48.         g[i][j].clear();
  49.         cost[i][j].clear();
  50.  
  51.     }
  52.     rep(i , 5) rep(j ,102 ) rep(k , 102) dis[i][j][k] = 99999999 ;
  53.  
  54. }
  55.  
  56.  
  57.  
  58. int dij(int des ){
  59.     int i , j , k ;
  60.     priority_queue<make> pq ;
  61.   //  printf("her\n");
  62.     rep(i , 5) if(g[i][0].size() != 0 ){
  63.     //    printf("here\n");
  64.         pq.push(make(i , 0 ,0  , 0)) ;
  65.     }
  66.     rep(i , 5  ) if(g[i][0].size() != 0 ) dis[i][0][0] = 0;
  67.  
  68.     while(!pq.empty()){
  69.         make x =  pq.top() ;
  70.         pq.pop() ;
  71.  
  72.         int  c = dis[x.t ][x.u ][x.d ] ;
  73.         int u =  x.d ;
  74.  
  75.         //if(x.d ==  des ) break  ;
  76.         int cc ;
  77.         rep(cc , lift[u].size()){
  78.             i = lift[u][cc];
  79.           //  printf("ligft %d\n", i) ;
  80.              rep(j , g[i][u].size() ){
  81.  
  82.             int v = g[i][u][j] ;
  83.             int calc = c + cost[i][u][j] ;
  84.  
  85.             if(u != 0 && i != x.t ) calc += 60  ;
  86.        // if(v ==  27)
  87.  
  88.             if(calc < dis[i][u][v]){
  89.        // printf("from(%d %d %d )(%d )%d -> %d %d\n",x.t , x.u , x.d ,i , u  ,  v , calc ) ;
  90.  
  91.                 dis[i][u][v] = calc ;
  92.                 pq.push(make(i ,u , v , cost[i][u][j] ) ) ;
  93.  
  94.  
  95.             }
  96.         }
  97.     }
  98.     }
  99.     int mm = 99999999;
  100.     rep(i  , 5)rep(j , 100) if(dis[i][j][des] < mm) mm = dis[i][j][des] ;
  101.     return mm ;
  102. }
  103.  
  104.  
  105. void call(int  t){
  106. int i ,j ,k  ;
  107.     rep(i , t){
  108.         printf("lift %d ",i );
  109.         rep(j ,15){
  110.             if(g[i][j].size()== 0) continue ;
  111.                 printf("%d ->", j );
  112.             rep(k , g[i][j].size())
  113.                 printf("%d ",cost[i][j][k ] ) ;
  114.             printf("\n");
  115.         }
  116.         printf("\n");
  117.     }
  118.  
  119.  
  120.  
  121. }
  122.  
  123. int  f(){
  124.     int k ;
  125.    // printf("her \n");
  126.     vector<int> v;
  127.     string line ;
  128.         getline(cin ,line );
  129.         istringstream os(line) ;
  130.         int i ;
  131.         while(os >> i){
  132.             v.push_back(i);
  133.  
  134.         }
  135.         k = v.size() ;
  136.      //   int i ;
  137.         rep(i , k ) temp[i] = v[i] ;
  138.        // rep(i, k ) printf("%d ", temp[i] );
  139.         //printf("input taken  \n");
  140.  
  141. return k ;
  142.  
  143. }
  144.  
  145. void solve(){
  146. int i ,j , k , u ,t , d  ;
  147.  
  148.     while(scanf("%d%d",&t ,&d ) ==  2){
  149.     clr() ;
  150.  
  151.     rep(i , t  )scanf("%d",&arr[i] ) ;
  152.  
  153.     getchar();
  154.  
  155.     rep(j , t ) {
  156.        k = f() ;
  157.     //    printf("here \n");
  158.        rep(i , k ) lift[temp[i] ].pb(j) ;
  159.         for(i = 1 ; i < k ;i++){
  160.             int u =  temp[i] ;
  161.             int v = temp[i-1] ;
  162.             int w ;
  163.  
  164.             w =(abs( u - v )) *arr[j] ;
  165.             g[j][u].pb(v) ;
  166.            g[j][v].pb(u ) ;
  167.  
  168.             cost[j][u].pb(w) ;
  169.             cost[j][v].pb(w ) ;
  170.  
  171.      }
  172.    //  printf("ending lift %d\n",j ) ;
  173.     }
  174.  
  175.     // printf("asci \n");
  176.    // call(t) ;
  177.  
  178.  
  179.   // printf("calling diksta\n");
  180.  //  rep(i , lift[8].size() ) printf("8 info ->%d\n" , lift[8][i]) ;
  181.     k = dij(d ) ;
  182.     //printf("\ntaken \n");
  183.     if(k == 99999999) printf("IMPOSSIBLE\n") ;
  184.     else printf("%d\n",k);
  185.  
  186.     }
  187.  
  188.  
  189.  
  190. }
  191.  
  192. int main(){
  193.  //freopen("in.txt", "r",stdin );
  194.  
  195.   int i , j , k , cs= 0 , tc ;
  196.     clr() ;
  197.     solve() ;
  198.  
  199.  
  200.  
  201.   return 0;
  202. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement