Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
38034 | wl2025 | 【BJ】T1 | C++ | 通过 | 100 | 88 MS | 5856 KB | 1966 | 2025-06-10 15:07:26 |
#include <bits/stdc++.h> using namespace std; const int N = 1005; const int INF = 0x3f3f3f3f; int n, a[N], b[N]; vector<int> v1[N]; int tot, dfn[N], low[N], tp, stk[N], instk[N]; int cnt, bel[N]; vector<int> scc[N]; vector<int> v2[N]; int in[N], q[N]; int f[N][N], g[N][2], ans[N]; void dfs(int x) { dfn[x] = low[x] = ++tot; stk[++tp] = x; instk[x] = 1; for (int y : v1[x]) { if (!dfn[y]) { dfs(y); low[x] = min(low[x], low[y]); } else if (instk[y]) low[x] = min(low[x], dfn[y]); } if (dfn[x] == low[x]) { cnt++; while (1) { int y = stk[tp--]; instk[y] = 0; bel[y] = cnt; scc[cnt].push_back(y); if (x == y) break; } } } int main() { cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i] >> b[i]; int t; cin >> t; while (t--) { int x; cin >> x; v1[i].push_back(x); } } for (int i = 1; i <= n; i++) if (!dfn[i]) dfs(i); for (int i = 1; i <= n; i++) { for (int j : v1[i]) { if (bel[i] == bel[j]) continue; in[bel[j]]++; v2[bel[i]].push_back(bel[j]); } } memset(f, 0x3f, sizeof(f)); memset(ans, 0x3f, sizeof(ans)); int l = 1, r = 0; for (int i = 1; i <= cnt; i++) if (!in[i]) q[++r] = i, f[i][0] = 0; while (l <= r) { int x = q[l++]; for (int i = 0; i <= n; i++) g[i][0] = f[x][i], g[i][1] = INF; for (int y : scc[x]) { for (int i = n - 1; ~i; i--) { g[i + 1][0] = min(g[i + 1][0], g[i][0] + a[y]); g[i + 1][1] = min(g[i + 1][1], g[i][0] + b[y]); g[i + 1][1] = min(g[i + 1][1], g[i][1] + a[y]); } } for (int i = 0; i <= n; i++) f[x][i] = min(f[x][i], g[i][1]); for (int i = 0; i <= n; i++) ans[i] = min(ans[i], f[x][i]); for (int y : v2[x]) { for (int i = 0; i <= n; i++) f[y][i] = min(f[y][i], f[x][i]); if (!--in[y]) q[++r] = y; } } for (int i = 1; i <= n; i++) { if (ans[i] > 1e9) break; cout << ans[i] << '\n'; } return 0; }