20 pts 求调
查看原帖
20 pts 求调
1050431
DevilsFlame楼主2024/9/11 12:29
#include<bits/stdc++.h>
using namespace std;
const int N = 310;
int n,m,a,f[N],s[N],g[N][2],dp[N],mm,o;//0 分数和  1 总数
vector <int> q[N];
queue <int> d_0;
inline void read(int &x)
{
	x = 0;
	int f = 1;
	char s = getchar();
	while(s < '0' || s > '9')
	{
		if(s == '-') f = -1;
		s = getchar();
	}
	while(s >= '0' && s <= '9')
	{
		x = x * 10 + s - 48;
		s = getchar();
	}
	x *= f;
	return;
}
void dfs(int x,int c)//c 选c门课程
{
//	cout << x << ' ' << c << endl;
	if(c > m) return;
	g[x][0] = s[x] + g[f[x]][0];
	g[x][1] = g[f[x]][1] + 1;
	if(g[x][1] > o)
	{
		mm = mm - o + g[x][1];
		o = g[x][1];
	}
	dp[c] = max(g[x][0] + dp[c - g[x][1]],dp[c]);
// 	cout << dp[c] << endl;
	for(int to = 0;to < q[x].size();to ++)
	dfs(q[x][to],c + 1);
	return;
}
int main()
{
	read(n),read(m);
	for(int i = 1;i <= n;i ++)
	{
		read(a),read(s[i]);
		f[i] = a;
		q[a].push_back(i);
	}
	for(int i = 1;i <= n;i ++) if(!f[i]) d_0.push(i);
//	cout << endl << endl;
	while(!d_0.empty())
	{
		int to = d_0.front();
		d_0.pop();
		if(!g[to][1])
		{
			int j = to;
			while(f[j]) j = f[j];
			o = 0;
			int v = mm;
			for(int i = v + 1;i > 0;i --) dfs(j,i);
		}
	}
	printf("%d\n",dp[m]);
	return 0;
}
2024/9/11 12:29
加载中...