#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++ 没过,还没改回来就时间到了 这是改完后的,不知道能不能过,希望哪位大佬能帮我看看
点赞 评论

相关推荐

02-10 12:23
已编辑
新余学院 C++
采集想要offer:专业技能那里要一条一条的列出来吧,感觉你项目很厉害了,但是如果你不写技术栈面试官对你项目不太懂的话都没办法问你八股😂C++都是基架岗,都是一群9✌🏻在卷,我觉得你要是有时间学个go把MySQL和redis写上去找个开发岗吧
点赞 评论 收藏
分享
Cassifa:发的字比你都多的一律视为骗子或者想白嫖压榨实习生的
点赞 评论 收藏
分享
牛客网
牛客企业服务