#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(vector& point, vector >& state, int stay_prev, int cur_p, int cur_c) { if(!min_u(state[stay_prev][cur_p], cur_c)) return; int n=point.size(); if(cur_p!=0 && cur_p!=n-1 && stay_prev0) idx=n; if(state[idx][cur_p]<0 || state[idx][cur_p]>nc) { solve(point, state, idx, cur_p, nc); } } for(auto r: point[cur_p].road) { solve(point, state, stay_prev, r.to, cur_c+r.c); } } int main(void) { int n, m, i, a, b, c; vector point; vector > state; while(scanf("%d", &n)==1) { point.clear(); point.resize(n); state.resize(n+1); for(i=0;i