社区讨论

求条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 条回复,欢迎继续交流。

正在加载回复...