萌新求助,只过了一个点,其余WA了
  • 板块P1411 树
  • 楼主2328wangyibo
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/7/17 17:29
  • 上次更新2023/11/3 09:17:51
查看原帖
萌新求助,只过了一个点,其余WA了
911978
2328wangyibo楼主2023/7/17 17:29

只拿了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函数计算每个节点的连通块大小。

使用一个循环遍历所有节点,并计算删除当前节点后,所有连通块大小的乘积。我们将这个乘积与当前的最大分数比较,并更新最大分数。

最后,输出最大分数。

求大佬帮调,感谢

2023/7/17 17:29
加载中...