感觉和题解好像也没多大区别,为什么会爆TLE,上面的是我按照第一篇题解改的,下面的是原来的
#include <bits/stdc++.h>
using namespace std;
int read()
{
int x = 0, f = 1;
char ch = getchar();
while (!isdigit(ch))
{
if (ch == '-')
f = -1;
ch = getchar();
}
while (isdigit(ch))
{
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
int n, w[6010], f[6010][2], root = 1;
vector<int> e[6010];
void dfs(int u)
{
f[u][0] = 0, f[u][1] = w[u];
for (int i = 0; i < (int)e[u].size();i++)
{
int v = e[u][i];
dfs(v);
f[u][0] += max(f[v][0], f[v][1]);
f[u][1] += f[v][0];
}
}
int main()
{
n = read();
for (int i = 1; i <= n; i++)
w[i] = read();
for (int i = 1; i < n; i++)
{
int x = read(), y = read();
e[y].push_back(x);
if (x == root)
root = y;
}
dfs(root);
cout << max(f[root][0], f[root][1]);
return 0;
}
/*
int n, w[6010], root = 1,;
vector<int> e[6010];
int dfs(int u, bool mark)
{
int maxw1 = 0, maxw2 = 0;
if (!mark)
{
maxw1 = w[u];
for (int i = 0; i < (int)e[u].size(); i++)
maxw1 += dfs(e[u][i], 1);
}
for (int i = 0; i < (int)e[u].size(); i++)
maxw2 += dfs(e[u][i], 0);
return max(maxw1,maxw2);
}
int main()
{
n = read();
for (int i = 1; i <= n; i++)
w[i] = read();
for (int i = 1; i < n; i++)
{
int x = read(), y = read();
e[y].push_back(x);
if (x == root)
root = y;
}
cout << dfs(root, 0);
return 0;
}
60分解,其他TLE
*/