tcbpg

Untitled

Nov 29th, 2011
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.85 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <queue>
  4. #include <vector>
  5. #include <cstring>
  6. #include <algorithm>
  7.  
  8. using namespace std;
  9.  
  10. #define forn(i,n) for(int i=0;i<(int)(n);i++)
  11. #define DBG(x) //cerr << #x << " = " << x << endl;
  12. #define RAYA //cerr << endl << "------------------------------------" << endl;
  13.  
  14. int w,h,g,e,c,n;
  15. char maze[30*30];
  16.  
  17. pair<int, pair<int,int> > edges[31*31*31*31];
  18. pair<int, pair<int,int> > holes[30*30];
  19. bool visited[30*30];
  20.  
  21. int dx[] = {-1,0,0,1};
  22. int dy[] = {0,-1,1,0};
  23.  
  24. #define copy(p,q) {(p).first = (q).first; (p).second.first = (q).second.first; (p).second.second = (q).second.second; }
  25. #define set(p,a,b,c) {(p).first = a; (p).second.first = b; (p).second.second = c; }
  26.  
  27. int dist[31*31];
  28. const int INF = 0x7f7f7f7f, NINF = 0x8f7f7f7f;
  29. int bfs(int s, int e){
  30.     memset(visited, 0, sizeof(visited));
  31.     queue< pair<int,int> > q;
  32.    
  33.     q.push(make_pair(0,s));
  34.     visited[s] = true;
  35.    
  36.     while(!q.empty()){
  37.         int t = q.front().first, p = q.front().second;
  38.         q.pop();
  39.        
  40.         if(p == e) return t;
  41.         forn(i,4){
  42.             int nr = (p/w+dx[i]), nc = (p%w+dy[i]);
  43.             int npos = nr*w+nc;
  44.             if(nr >= 0 && nc >= 0 && nr < h && nc < w && maze[npos] == '.' && !visited[npos]){
  45.                 visited[npos] = true;
  46.                 q.push(make_pair(t+1,npos));
  47.             }
  48.         }
  49.     }
  50.    
  51.     return INF;
  52. }
  53.  
  54. bool bford(){
  55.     forn(i,w*h) dist[i] = INF;
  56.     dist[w*(h-1)] = 0;
  57.    
  58.     forn(i, n)
  59.     forn(j, c){
  60.         int source = edges[j].first,
  61.             dest = edges[j].second.second,
  62.             weight = edges[j].second.first;
  63.        
  64.         dist[dest] = min(dist[source]+weight,dist[dest]);
  65.     }
  66.    
  67.     forn(j, c){
  68.         int source = edges[j].first,
  69.             dest = edges[j].second.second,
  70.             weight = edges[j].second.first;
  71.            
  72.         if(dist[dest] > dist[source]+weight)
  73.             return true;
  74.     }
  75.    
  76.     return false;
  77. }
  78.  
  79. int main(){
  80.     #ifndef ONLINE_JUDGE
  81.         freopen("GRAVEYRD.in","r",stdin);
  82.     #endif
  83.    
  84.     while(scanf("%d %d\n",&w,&h) && w != 0){
  85.         scanf("%d\n",&g);
  86.  
  87.         forn(i,w*h) maze[i] = '.';
  88.  
  89.         forn(i,g){
  90.             int r,c; scanf("%d %d\n",&c,&r);
  91.             r = h-r-1;
  92.             maze[r*w+c] = '#';
  93.         }
  94.  
  95.         scanf("%d\n", &e);
  96.         forn(i,e){
  97.             int sr,sc,er,ec,t;
  98.             scanf("%d %d %d %d %d",&sc,&sr,&ec,&er,&t);
  99.             sr = h-sr-1;
  100.             er = h-er-1;
  101.  
  102.             set(holes[i],sr*w+sc,t,er*w+ec);
  103.         }
  104.    
  105.         n = e+2;
  106.         int start = w*(h-1);
  107.         int end = w-1;
  108.         c = 0;
  109.        
  110.         set(edges[c],start,bfs(start,end),end);
  111.         c++;
  112.        
  113.         forn(i,e){
  114.             copy(edges[c],holes[i]);
  115.             c++;
  116.             set(edges[c],start,bfs(start,holes[i].first),holes[i].first);
  117.             c++;
  118.             set(edges[c],holes[i].second.second, bfs(holes[i].second.second, end),end);
  119.             c++;
  120.         }
  121.        
  122.         forn(i, e)
  123.         forn(j, e){
  124.             set(edges[c],holes[i].second.second,bfs(holes[i].second.second,holes[j].first),holes[j].first);
  125.             c++;
  126.         }
  127.  
  128.         bool res = bford();
  129.         if(res){
  130.             printf("Never\n");
  131.         }else{
  132.             if(dist[w-1] < INF) printf("%d\n",dist[w-1]);
  133.             else printf("Impossible\n");
  134.         }
  135.     }
  136. }
  137.  
  138.  
Advertisement
Add Comment
Please, Sign In to add comment