Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <queue>
- #include <vector>
- using namespace std;
- const int inf=(-1u)/2;
- vector< vector<int> > table;
- vector< vector<int> > ansthis;
- int n;
- int answer=inf;
- queue<pair<int,pair<int,int> > > dijq; //inf-distance,x,y
- void add(int x,int y,int dist)
- {
- dist=inf-dist;
- dijq.push(make_pair(dist,make_pair(x,y)));
- }
- int getdist()
- {
- return inf-dijq.front().first;
- }
- int getx()
- {
- return dijq.front().second.first;
- }
- int gety()
- {
- return dijq.front().second.second;
- }
- void popit()
- {
- dijq.pop();
- }
- int dijkstra()
- {
- int mini=inf;
- while(dijq.empty()==false)
- {
- int distance=getdist();
- int x=getx();
- int y=gety();
- popit();
- if((ansthis[x][y]==-1)^(ansthis[x][y]>distance))
- {
- ansthis[x][y]=distance;
- //make nexts
- if(x!=0)
- add(x-1,y,distance+table[x-1][y]);
- if(x!=n-1)
- add(x+1,y,distance+table[x+1][y]);
- if(y!=n-1)
- add(x,y+1,distance+table[x][y+1]);
- else
- {
- mini=min(mini,distance);
- }
- }
- }//end of while
- return mini;
- }
- void solve()
- {
- for(int i=0;i<n;++i)
- {
- add(i,0,table[i][0]);
- answer=min(answer,dijkstra());
- }
- }
- void printans()
- {
- printf("%d\n",answer);
- }
- int main()
- {
- //scanf("%d",&n);
- n=80;
- table.resize(n);
- ansthis.resize(n);
- for(int i=0;i<n;++i)
- {
- table[i].resize(n);
- ansthis[i].resize(n);
- for(int j=0;j<n;++j)
- {
- scanf("%d",&table[i][j]);
- ansthis[i][j]=-1;
- }
- }
- solve();
- printans();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement