#include <bits/stdc++.h>
using namespace std;

const int N = 200 + 5;
int a[N];

vector <int> vec[N];
vector <int> fac[N];
vector <pair<double, double> > Node[N];
vector <pair<double, double> > tmp;
bool vis[N];
double fini[N];
int n, m, B, E;

void dfs(int v)
{
  tmp.clear();
  if(v == B) {
    vis[v] = 1; fini[v] = 1.0 * a[v] / (1.0 * E);
    double flo = 0.0;
    if(vec[v].size()) flo = 1.0 * E / (1.0 * vec[v].size());
    tmp.push_back(make_pair(fini[v], flo));
    Node[v] = tmp;
    return ;
  }

  for(auto u: fac[v]) {
    //cout << v << " " << u << endl;
    if(!vis[u]) dfs(u);
    for(auto x: Node[u]) {
      tmp.push_back(x);
      //cout << v << " " << u << " " << x.first << " " << x.second << endl;
    }
  }
  vis[v] = 1;
  if(tmp.size() == 0) {
    fini[v] = -1.0; return ;
  }
  sort(tmp.begin(), tmp.end());
  int tmpl = tmp.size();
  double pre = 0.0;
  double sum = 0.0;
  int flg = -1;
  for(int i = 0; i < tmpl-1; ++ i) {
    pre += tmp[i].second;
    double inv = tmp[i+1].first - tmp[i].first;
    if(sum + inv*pre > 1.0 * a[v]) {
      fini[v] = tmp[i].first + 1.0 * (1.0 * a[v] - sum) / pre;
      flg = i; break;
    }
    sum += inv*pre;
  }
  if(flg == -1) {
    double ptim = tmp[tmpl - 1].first;
    //if(tmpl >= 2) ptim = tmp[tmpl - 2].first;
    fini[v] = ptim + 1.0 * (1.0 * a[v] - sum) / (pre + tmp[tmpl - 1].second);
    double fi = fini[v];
    double se = pre + tmp[tmpl - 1].second;
    tmp.resize(1);
    tmp[0] = make_pair(fi, se / (1.0 * vec[v].size()));
    Node[v] = tmp;
    return ;
  }
  int nl = 0;
  for(int i = flg; i < tmpl; ++ i) {
    tmp[nl] = tmp[i];
    tmp[nl].second = tmp[i].second / (1.0 * vec[v].size());
    nl ++;
  }
  tmp[0].first = fini[v];
  tmp[0].second = pre / (1.0 * vec[v].size());
  tmp.resize(nl);
  Node[v] = tmp;
  return ;
}

int main()
{
  int T;
  scanf("%d", &T);
  while(T --) {
    scanf("%d%d%d%d", &n, &m, &B, &E);
    for(int i = 1; i <= n; ++ i) {
      scanf("%d", a + i);
      vec[i].clear();
      fac[i].clear();
      Node[i].clear();
    }
    for(int i = 1; i <= m; ++ i) {
      int u, v;
      scanf("%d%d", &u, &v);
      vec[u].push_back(v);
      fac[v].push_back(u);
    }
    memset(vis, 0, sizeof(vis));
    for(int i = 1; i <= n; ++ i) {
      if(!vis[i]) dfs(i);
    }
    for(int i = 1; i <= n; ++ i) {
      printf("%.8f", fini[i]);
      if(i != n) printf(" ");
    }
    printf("\n");
  }
  return 0;
}
第三题,场上少写了个 nl++ 没过,还没改回来就时间到了
这是改完后的,不知道能不能过,希望哪位大佬能帮我看看