/* [NWERC'09] Wormholes by: Jan Kuipers */ #include #include #include #include #include #include using namespace std; struct point { int x,y,z; }; int dist (point a, point b) { return (int)ceil(sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z))); } int main() { int runs; cin>>runs; while (runs--) { vector pfr(2),pto; cin>>pfr[0].x>>pfr[0].y>>pfr[0].z; cin>>pfr[1].x>>pfr[1].y>>pfr[1].z; int N; cin>>N; N+=2; pfr.resize(N); pto=pfr; vector t0(N,-INT_MAX), dt(N,0); for (int i=2; i>pfr[i].x>>pfr[i].y>>pfr[i].z; cin>>pto[i].x>>pto[i].y>>pto[i].z; cin>>t0[i]>>dt[i]; } vector best(N, INT_MAX/2); best[0]=0; vector prev(N,-1); vector prevm(N,-1); bool change=true; while (change) { change = false; int incycle = -1; for (int times=0; times cycle; vector used(N,false); while (!used[incycle]) { cycle.push_back(incycle); used[incycle]=true; incycle=prev[incycle]; } while (cycle.front()!=incycle) cycle.pop_front(); int cut=INT_MAX; for (int ii=0; ii<(int)cycle.size(); ii++) { int i=cycle[ii]; if (prevm[i]) cut = min(cut, best[i] - dt[i] - t0[i]); } for (int i=0; i<(int)cycle.size(); i++) best[cycle[i]] -= cut; } } cout<