只拿了5分,求大佬帮调
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> graph;
vector<int> visited;
vector<int> size;
int dfs(int node) {
visited[node] = 1;
int curr_size = 1;
for (int neighbor : graph[node]) {
if (!visited[neighbor]) {
curr_size += dfs(neighbor);
}
}
size[node] = curr_size;
return curr_size;
}
int main() {
int n;
cin >> n;
graph.resize(n + 1);
visited.resize(n + 1, 0);
size.resize(n + 1, 0);
for (int i = 0; i < n - 1; i++) {
int u, v;
cin >> u >> v;
graph[u].push_back(v);
graph[v].push_back(u);
}
dfs(1);
long long max_score = 0;
for (int i = 1; i <= n; i++) {
max_score = max(max_score, (long long)size[i] * (n - size[i]));
}
cout << max_score << endl;
return 0;
}
个人WA的思路如下:根据题目描述,我们需要计算删除树中任意数量的边后,所有连通块大小的乘积,以得到最大分数。
为了解决这个问题,我们可以使用深度优先搜索(DFS)来遍历树,并计算每个连通块的大小。在遍历的过程中,我们可以记录每个节点的子节点数量,并计算连通块的大小。首先定义了一个graph向量来表示树的连接关系,visited向量来记录节点的访问状态,size向量来记录每个节点的连通块大小。
然后,我们使用一个深度优先搜索函数dfs来遍历树。在每个节点的遍历过程中,我们将其标记为已访问,并递归地遍历其未访问的邻居节点。在递归过程中,我们计算当前连通块的大小,并返回这个大小。
接下来,我们在main函数中读取输入,构建树的连接关系,并使用dfs函数计算每个节点的连通块大小。
使用一个循环遍历所有节点,并计算删除当前节点后,所有连通块大小的乘积。我们将这个乘积与当前的最大分数比较,并更新最大分数。
最后,输出最大分数。
求大佬帮调,感谢