这个找树的重心为什么错了呢
  • 板块P1395 会议
  • 楼主liujb
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/18 18:44
  • 上次更新2023/11/2 13:02:39
查看原帖
这个找树的重心为什么错了呢
818698
liujb楼主2023/10/18 18:44

求调试

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;

const int N = 1e5 + 10;
int n;
vector<int> v[N];
bool vis[N];
int ans = N; // 去掉重心后所有连通块中最大值
int f = N;
int dis[N];

int dfs(int u) { // 返回值是以u为根的子树的节点数
    vis[u] = true;
    int size = 0; // 存储去掉u的所有子树的最大节点数
    int sum = 1; // 存放以u为根的子树的节点的个数
    for(int i = 0; i < v[u].size(); i ++ ) {
        int j = v[u][i]; 
        if(!vis[j]) {
            int s = dfs(j);
            sum += s;
            size = max(s, size); // 比较所有子树的节点数目
        }
    }
    
    ans = min(ans, max(size, n - sum)); //比较去掉重心的子树的节点数目使其最小
    if(ans == max(size, n - sum)) f = min(f, u);

    return sum;
}


void dfsd(int u, int cnt) { //求取最短距离之和
    vis[u] = true;
    dis[u] = cnt;
    for(int i = 0; i < v[u].size(); i ++ ) {
        int j = v[u][i];
        if(!vis[j]) {
            
            dfsd(j, cnt + 1);
        }
    }
}
int main() {
    cin >> n;
    
    for(int i = 1; i < n; i ++ ) {
        int a, b;
        cin >> a >> b;
        
        v[a].push_back(b);
        v[b].push_back(a);
    }
    
    dfs(1);
    
    memset(vis, false, sizeof vis);

    dfsd(f, 0);
    
    int res = 0;
    for(int i = 1; i <= n; i ++ ) {
        res += dis[i];
        // cout << dis[i] << endl;
    }
    
    // cout << ans << endl;
    cout << f << ' ';
    cout << res << endl;
    return 0;
}
2023/10/18 18:44
加载中...