#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef unsigned int ui; const ll mod = 1000000007; const ll INF = (ll)1000000007 * 1000000007; typedef pair P; #define stop char nyaa;cin>>nyaa; #define rep(i,n) for(int i=0;i=0;i--) #define Rep(i,sta,n) for(int i=sta;i=sta;i--) #define rep1(i,n) for(int i=1;i<=n;i++) #define per1(i,n) for(int i=n;i>=1;i--) #define Rep1(i,sta,n) for(int i=sta;i<=n;i++) typedef long double ld; const ld eps = 1e-8; const ld pi = acos(-1.0); typedef pair LP; typedef pair PP; typedef pair node; int dx[4]={1,-1,0,0}; int dy[4]={0,0,1,-1}; templatebool chmax(T &a, const T &b) {if(abool chmin(T &a, const T &b) {if(b> n >> m; rep(i,m){ int h,w;ll c; cin >> h >> w >> c;h--;w--; cost[h][w]=c; } rep(i,n){ rep(j,n){ rep(flag,2){ dist[i][j][flag]=INF; } } } priority_queue,greater> que; que.push(node(0,PP(P(0,0),0))); while(!que.empty()){ node nod=que.top();que.pop(); ll d=nod.first;int y=nod.second.first.first,x=nod.second.first.second,flag=nod.second.second; //cout << y << " " << x << " " << flag << " : " << d << endl; rep(k,4){ int ny=y+dy[k],nx=x+dx[k]; if(ny<0 || ny>n-1 || nx<0 || nx>n-1) continue; //cout << ny << " " << nx << endl; if(flag){ if(chmin(dist[ny][nx][1],d+1+cost[ny][nx])){ que.push(node(dist[ny][nx][1],PP(P(ny,nx),1))); } } else{ if(chmin(dist[ny][nx][1],d+1)){ que.push(node(dist[ny][nx][1],PP(P(ny,nx),1))); } if(chmin(dist[ny][nx][0],d+1+cost[ny][nx])){ que.push(node(dist[ny][nx][0],PP(P(ny,nx),0))); } } } } cout << min(dist[n-1][n-1][0],dist[n-1][n-1][1]) << endl; } int main(){ ios::sync_with_stdio(false); cin.tie(0); cout << fixed << setprecision(50); solve(); }