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;
}
全部评论

相关推荐

但听说转正率很低,我现在有在实习了,好纠结要不要去
熬夜脱发码农:转正率低归低,但是实习的经历你可以拿着,又不是说秋招不准备了
点赞 评论 收藏
分享
07-03 11:02
中山大学 C++
字节刚oc,但距离九月秋招很近了有两段互联网实习,非腾讯字节。不敢赌转正,现在在纠结去还是不去如果实习俩月离职会有什么后果吗
阿城我会做到的:不去后悔一辈子,能否转正取决于ld的态度,只要他不卡,答辩就是走流程,个人觉得可以冲一把
投递字节跳动等公司9个岗位
点赞 评论 收藏
分享
陆续:不可思议 竟然没那就话 那就我来吧 :你是我在牛客见到的最美的女孩
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务