SRM383 div2 hard

行きと帰りでダイクストラして足すだけ、実装がエラいことになった

#include <string>
#include <vector>
#include <queue>
#include <algorithm>
#include <cmath>

using namespace std;

class EDGE
{
	public:
		int to,cost;
		bool operator <(const EDGE &e)
			const
			{
				return !(cost<e.cost);
			}
};

class HillWalker
{
	public:
		int h,w,limit,thres;
		vector<string> map;

		int dist(int a,int b)
		{
			int y1=a/w,x1=a%w,y2=b/w,x2=b%w;
			if(thres < abs(map[y1][x1]-map[y2][x2]))
				return (1<<29);
			if(map[y1][x1] < map[y2][x2])
			{
				int i=map[y1][x1]-map[y2][x2];
				i*=i;
				return i;
			}
			else
				return 1;
		}

		int highestPoint(vector<string> _map,int _thres,int _limit)
		{
			map=_map;
			thres=_thres;
			limit=_limit;
			h=map.size();
			w=map[0].size();
			for(int i=0;i<h;i++)
				for(int j=0;j<w;j++)
				{
					char c=map[i][j];
					if('A'<=c && c<='Z')
						c-='A';
					else if('a'<=c && c<='z')
					{
						c-='a';
						c+=26;
					}
					map[i][j]=c;
				}
			
			/*printf("map\n");
			for(int i=0;i<h;i++)
			{
				for(int j=0;j<w;j++)
					printf("%4d",map[i][j]);
				printf("\n");
			}*/

			vector<vector<int> > toCost(h,vector<int>(w,(1<<29)));
			vector<vector<int> > fromCost(h,vector<int>(w,(1<<29)));

			int mv[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
			EDGE e;
			priority_queue<EDGE> que;

			e.cost=0,e.to=0;
			que.push(e);
			while(!que.empty())
			{
				e=que.top();
				que.pop();
				int y=e.to/w,x=e.to%w,c=e.cost;
				if(c < toCost[y][x])
				{
					toCost[y][x]=c;
					for(int i=0;i<4;i++)
					{
						int yy=y+mv[i][0],xx=x+mv[i][1];
						if(0<=yy && yy<h && 0<=xx && xx<w)
						{
							e.to=yy*w+xx;
							e.cost=toCost[y][x]+dist(y*w+x,yy*w+xx);
							que.push(e);
						}
					}
				}
			}
			
			/*printf("toCost\n");
			for(int i=0;i<h;i++)
			{
				for(int j=0;j<w;j++)
					printf("%4d",toCost[i][j]);
				printf("\n");
			}*/

			e.cost=0,e.to=0;
			que.push(e);
			while(!que.empty())
			{
				e=que.top();
				que.pop();
				int y=e.to/w,x=e.to%w,c=e.cost;
				if(c < fromCost[y][x])
				{
					fromCost[y][x]=c;
					for(int i=0;i<4;i++)
					{
						int yy=y+mv[i][0],xx=x+mv[i][1];
						if(0<=yy && yy<h && 0<=xx && xx<w)
						{
							e.to=yy*w+xx;
							e.cost=fromCost[y][x]+dist(yy*w+xx,y*w+x);
							que.push(e);
						}
					}
				}
			}
			
			/*printf("fromCost\n");
			for(int i=0;i<h;i++)
			{
				for(int j=0;j<w;j++)
					printf("%4d",fromCost[i][j]);
				printf("\n");
			}*/

			int ans=0;
			for(int i=0;i<h;i++)
				for(int j=0;j<w;j++)
					if(toCost[i][j]+fromCost[i][j] <= limit)
						ans=max(ans,(int)map[i][j]);

			return ans;
		}
};