Advertisement
aryobarzan

ProjectEuler 82

Jun 7th, 2011
327
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.49 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <queue>
  5. #include <vector>
  6. using namespace std;
  7.  
  8. const int inf=(-1u)/2;
  9. vector< vector<int> > table;
  10. vector< vector<int> > ansthis;
  11. int n;
  12. int answer=inf;
  13. queue<pair<int,pair<int,int> > > dijq; //inf-distance,x,y
  14.  
  15. void add(int x,int y,int dist)
  16. {
  17.     dist=inf-dist;
  18.     dijq.push(make_pair(dist,make_pair(x,y)));
  19. }
  20.  
  21. int getdist()
  22. {
  23.     return inf-dijq.front().first;
  24. }
  25.  
  26. int getx()
  27. {
  28.     return dijq.front().second.first;
  29. }
  30. int gety()
  31. {
  32.     return dijq.front().second.second;
  33. }
  34. void popit()
  35. {
  36.     dijq.pop();
  37. }
  38.  
  39. int dijkstra()
  40. {
  41.     int mini=inf;
  42.     while(dijq.empty()==false)
  43.     {
  44.     int distance=getdist();
  45.     int x=getx();
  46.     int y=gety();
  47.     popit();
  48.     if((ansthis[x][y]==-1)^(ansthis[x][y]>distance))
  49.     {
  50.         ansthis[x][y]=distance;
  51.         //make nexts
  52.         if(x!=0)
  53.         add(x-1,y,distance+table[x-1][y]);
  54.         if(x!=n-1)
  55.         add(x+1,y,distance+table[x+1][y]);
  56.         if(y!=n-1)
  57.         add(x,y+1,distance+table[x][y+1]);
  58.         else
  59.         {
  60.             mini=min(mini,distance);
  61.         }
  62.     }
  63.     }//end of while
  64.     return mini;
  65. }
  66.  
  67. void solve()
  68. {
  69.     for(int i=0;i<n;++i)
  70.     {
  71.         add(i,0,table[i][0]);
  72.         answer=min(answer,dijkstra());
  73.     }
  74. }
  75.  
  76. void printans()
  77. {
  78.     printf("%d\n",answer);
  79. }
  80.  
  81. int main()
  82. {
  83.     //scanf("%d",&n);
  84.     n=80;
  85.     table.resize(n);
  86.     ansthis.resize(n);
  87.     for(int i=0;i<n;++i)
  88.     {
  89.         table[i].resize(n);
  90.         ansthis[i].resize(n);
  91.         for(int j=0;j<n;++j)
  92.         {
  93.             scanf("%d",&table[i][j]);
  94.             ansthis[i][j]=-1;
  95.         }
  96.     }
  97.     solve();
  98.     printans();
  99.     return 0;
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement