luogu P5382 [THUPC2019]改善生活
https://www.luogu.com.cn/problem/P5382
写一波传递闭包就行了
其余不难,可以用bitset优化
code:
#include<bits/stdc++.h>
#define N 705
using namespace std;
int n, m, c[N], w[N], s[N];
bitset<N> g[N];
int main() {
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i ++) scanf("%d", &c[i]);
for(int i = 1; i <= n; i ++) scanf("%d", &w[i]);
for(int i = 1; i <= m; i ++) {
int u, v;
scanf("%d%d", &u, &v);
g[u][v] = 1;
}
for(int k = 1; k <= n; k ++)
for(int i = 1; i <= n; i ++)
if(g[i][k])
g[i] |= g[k];
int ans = 0;
for(int i = 1; i <= n; i ++) if(c[i] == 1) {
memset(s, 0, sizeof s);
for(int j = 1; j <= n; j ++) if(g[i][j]) s[c[j]] += w[j];
for(int j = 2; j <= n; j ++) ans = max(ans, s[j] / w[i]);
}
printf("%d", ans);
return 0;
}