首页 > 试题广场 >

小红的树权值

[编程题]小红的树权值
  • 热度指数:19 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}小红这样定义一棵树的权值:对于一棵树,删除若干节点(删除节点指将该节点及其关联的所有边从图中移除)后满足剩余的所有联通块大小都为 1,可能的最小删除数量即为这棵树的权值。
\hspace{15pt}现在小红拿到了一棵以 1 号节点为根,包含 n 个点的有根树,她想知道这棵树中 1\sim n 号点的所有子树的权值分别是多少,请你帮帮她。

【名词解释】
\hspace{15pt}子树:对于树中某个节点,其与所有后代节点构成的集合称为该节点的子树。

输入描述:
\hspace{15pt}每个测试文件均包含多组测试数据。第一行输入一个整数 T\left(1\leqq T\leqq 10^4\right) 代表数据组数,每组测试数据描述如下:

\hspace{15pt}第一行输入一个整数 n \left(1 \leqq n \leqq 10^5 \right)
\hspace{15pt}之后的 n - 1 行,每行输入两个整数 u,v \left(1 \leqq u, v \leqq n,u \ne v \right),代表有一条边连接 u,v

\hspace{15pt}除此之外,保证单个测试文件的 n 之和不超过 2 \times 10^5


输出描述:
\hspace{15pt}对于每组测试数据,新起一行。

\hspace{15pt}在一行内输出 n 个整数,依次代表 1 \sim n 号节点的子树的权值。
示例1

输入

1
5
1 2
2 3
3 4
3 5

输出

2 1 1 0 0

说明

\hspace{15pt}1 号点为根的子树:删除 2,3 号节点后符合要求,权值为 2
\hspace{15pt}2 号点为根的子树:删除 3 号节点后符合要求,权值为 1
\hspace{15pt}3 号点为根的子树:删除 3 号节点后符合要求,权值为 1
\hspace{15pt}4 号点为根的子树:初始状态已经符合要求,权值为 0
\hspace{15pt}5 号点为根的子树:初始状态已经符合要求,权值为 0

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 998244353;
int dp[100001][2];
struct Edge{
    int to,next;
};
int indx=0;
int head[100001];
void add(Edge edge[],int u,int v){
    edge[indx].to=v;
    edge[indx].next=head[u];
    head[u]=indx++;
}
void dfs(int u,int parent,Edge edge[]){
    dp[u][1]=1;
    dp[u][0]=0;
    for(int i=head[u];i!=-1;i=edge[i].next){
        if(edge[i].to!=parent)
        {
            dfs(edge[i].to,u,edge);
            dp[u][1]+=min(dp[edge[i].to][0],dp[edge[i].to][1]);
            dp[u][0]+=dp[edge[i].to][1];
        }
    }
}
int main(){

    int t;
    cin>>t;
    while(t--){
        indx=0;
        memset(dp,0x3f,sizeof(dp));
        memset(head,-1,sizeof(head));
        int n;
        cin>>n;
        Edge edge[2*n+1];
        for(int i=1;i<=n-1;i++){
            int u,v;
            cin>>u>>v;
            add(edge,u,v);
            add(edge,v,u);
        }
        dfs(1,-1,edge);
        for(int i=1;i<=n;i++){
            cout<<min(dp[i][1],dp[i][0])<<" ";
        }
        cout<<endl;
    }
}

发表于 2026-04-15 23:13:19 回复(0)