NC15748

旅游

https://ac.nowcoder.com/acm/problem/15748

题意:
给定一棵 n 个节点的树,初始选择节点 s,第一天定居在s,并将s和与s相邻的节点染色。之后每一天选择一个未染色的点定居,将定居点和定居点相邻的节点染色。问最多能定居多少个节点。

题解
每个点都会被染***r>考虑如何给叶子节点染色,发现要把叶子节点染色,定居在叶子处最佳,所以我们首先选择叶子节点定居。染色后把染色的点去掉,给新的叶子染色,直到所有节点被染色。

Code

#include <bits/stdc++.h>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fod(i,a,b) for(int i=a;i>=b;i--)
#define me0(a) memset(a,0,sizeof(a))
#define me1(a) memset(a,-1,sizeof(a))
#define op freopen("in.txt", "r", stdin)
using namespace std;
const int INF = 0x3f3f3f3f;
typedef long long LL;
void read(int& val) { int x = 0; int bz = 1; char c; for (c = getchar(); (c<'0' || c>'9') && c != '-'; c = getchar()); if (c == '-') { bz = -1; c = getchar(); }for (; c >= '0' && c <= '9'; c = getchar()) x = x * 10 + c - 48; val = x * bz; }
const int maxn = 5e5 + 101;
const int mod=1024523;
int n,s;
vector<int>g[maxn];
bool vis[maxn];
int ans=1;
void dfs(int u,int fa){
    for(auto to:g[u]){
        if(to==fa||vis[to]) continue;
        dfs(to,u);
    }
    if(!vis[u]){
        vis[u]=true;vis[fa]=true;ans++;
    }
}

int main(){
    read(n);read(s);
    fo(i,1,n-1){
        int u,v;read(u);read(v);
        g[u].push_back(v);g[v].push_back(u);
    }
    vis[s]=true;
    for(auto to:g[s]){
        vis[to]=true;
        dfs(to,s);
    }
    printf("%d\n",ans);
    return 0;
}
全部评论

相关推荐

3 收藏 评论
分享
牛客网
牛客企业服务