社区讨论
求条qwq||玄2关
P2515[HAOI2010] 软件安装参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mje31zer
- 此快照首次捕获于
- 2025/12/20 17:15 3 个月前
- 此快照最后确认于
- 2025/12/22 19:35 3 个月前
一份错误百出的code,样例没过,交上去RE
CPP#include<bits/stdc++.h>
using namespace std;
long long n, m;
long long w[1005], v[1005], d[1005];
vector<long long> tr[1005], g[1005];
long long dfn[1005], low[1005], idx = 0;
bool vis[1005];
long long stk[1005], top = 0;
long long belong[1005], ind[1005];
long long sumv[1005], sumw[1005], cnt = 0;
long long dp[1005][1005];
void tarjan(long long u)
{
dfn[u] = low[u] = ++ idx;
vis[u] = 1, stk[++ top] = u;
for (int i = 0; i < tr[u].size(); ++ i)
{
long long v = tr[u][i];
if (!dfn[v])
{
tarjan(v);
low[u] = min(low[u], low[v]);
}
else if (vis[v])
low[u] = min(low[u], dfn[v]);
}
if (dfn[u] == low[u])
{
cnt ++;
while (1)
{
belong[stk[top]] = cnt;
sumw[cnt] += w[stk[top]];
sumv[cnt] += v[stk[top]];
vis[stk[top --]] = 0;
if (stk[top] == u)
break;
}
belong[u] = cnt;
sumw[cnt] += w[u];
sumv[cnt] += v[u];
top --;
vis[u] = 0;
}
}
void dfs(long long u)
{
// cout << u << " ";
for (int i = sumw[u]; i <= m; ++ i)
dp[u][i] = sumv[u];
for (int i = 0; i < g[u].size(); ++ i)
{
long long v = g[u][i];
dfs(v);
for (int j = m - sumw[u]; j >= 0; -- j)
for (int k = 0; k <= j; ++ k)
dp[u][j + sumw[u]] = max(dp[u][j + sumw[u]], dp[v][k] + dp[u][j + sumw[u] - k]);
}
}
int main()
{
// ios::sync_with_stdio(false);
// cin.tie(0);
// cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; ++ i)
cin >> w[i];
for (int i = 1; i <= n; ++ i)
cin >> v[i];
for (int i = 1; i <= n; ++ i)
{
cin >> d[i];
if (d[i])
tr[d[i]].push_back(i);
}
for (int i = 1; i <= n; ++ i)
if (!dfn[i])
tarjan(i);
for (int i = 1; i <= n; ++ i)
{
if (belong[d[i]] != belong[i])
{
g[belong[d[i]]].push_back(belong[i]);
ind[belong[i]] ++;
}
}
for (int i = 1; i <= cnt; ++ i)
if (!ind[i])
g[0].push_back(i);
// for (int i = 0; i <= cnt; ++ i)
// {
// cout << i << ":";
// for (int j = 0; j < g[i].size(); ++ j)
// cout << g[i][j] << " ";
// cout << "\n";
// }
dfs(0);
cout << dp[0][m];
return 0;
}
/*
3 10
1 2 3
1 2 3
3 1 2
*/
回复
共 1 条回复,欢迎继续交流。
正在加载回复...