#include #include #include #include using namespace std; int main() { int n, m; cin >> n >> m; vector joy(n); vector value(n); vector> adj(n); vector> prev(n); vector adjct(n); queue q; stack s; for(int i = 0; i < n; i++) cin >> joy[i]; for(int i = 0; i < m; i++) { int s, t; cin >> s >> t; adj[s].push_back(t); prev[t].push_back(s); } for(int i = 0; i < n; i++) { adjct[i] = adj[i].size(); if(adjct[i] == 0) s.push(i); } while(!s.empty()) { int cur = s.top(); s.pop(); q.push(cur); for(int nb : prev[cur]) { adjct[nb]--; if(adjct[nb] == 0) { s.push(nb); } } } while(!q.empty()) { int cur = q.front(); q.pop(); // This assumes that you do not fill yourself up at your final stall. value[cur] = joy[cur]; for(int nb : adj[cur]) { value[cur] = max(value[cur], joy[cur] + value[nb]/2.0); value[cur] = max(value[cur], value[nb]); } } printf("%.10lf\n", value[0]); return 0; }