#include #include #include using namespace std; typedef long long ll; struct road_t { int to, c; }; struct point_t { int s; vector road; }; int min_u(int& m, int v) { if(m>v || m<0) { m=v; return 1; } return 0; } void solve_r(vector& point, vector& dp, int cur_p, int cur_c, int prev_stay) { int n=point.size(); int idx=prev_stay*n+cur_p; if(min_u(dp[idx], cur_c)==0) return; for(auto r: point[cur_p].road) { solve_r(point, dp, r.to, cur_c+r.c, prev_stay); } if(cur_p==0 || cur_p==n-1) return; if(prev_stay==cur_p || prev_stay==n-1) return; int n_stay=cur_p; if(prev_stay>0) n_stay=n-1; solve_r(point, dp, cur_p, cur_c+point[cur_p].s, n_stay); } int solve(vector& point) { int n=point.size(); vector dp(n*n, -1); solve_r(point, dp, 0, 0, 0); //for(int i=0;i point; while(scanf("%d", &n)==1) { point.clear(); point.resize(n); for(i=0;i