// 2009‘“à—\‘ID —£ŽU“I‘¬“x #include #include #include using namespace std; typedef vector< vector > graph; class Node{ public: int p, v, prev; double cost; Node(int p, int v, int prev, double cost) : p(p), v(v), prev(prev), cost(cost) {} bool operator < (const Node &nd) const { return cost > nd.cost; } }; int main(){ int n, m, s, g; while(cin >> n >> m){ if(!(n||m)) break; cin >> s >> g; graph gp(n); int dist[30][30]; int limit[30][30]; bool visit[30][31][30]; double len[30][31][30]; memset(visit, false, sizeof(visit)); for(int i=0;i> x >> y >> d >> c; gp[x-1].push_back(y-1); gp[y-1].push_back(x-1); dist[x-1][y-1] = d, dist[y-1][x-1] = d; limit[x-1][y-1] = c, limit[y-1][x-1] = c; } for(int i=0;i qu; qu.push(Node(s-1,0,s-1,0.0)); double ans = -1.0; while(!qu.empty()){ Node nd = qu.top(); qu.pop(); int p = nd.p, v = nd.v, prev = nd.prev; if(visit[p][v][prev]) continue; visit[p][v][prev] = true; if(p==g-1 && v==1){ ans = nd.cost; break; } for(int i=0;i nd.cost+(double)dist[p][next]/nv){ len[next][nv][p] = nd.cost+(double)dist[p][next]/nv; qu.push(Node(next,nv,p,len[next][nv][p])); } } } } if(ans < 0.0) cout << "unreachable" << endl; else printf("%.5f\n", ans); } }