AtCoder Beginner Contest 303 E - A Gift From the Stars

AtCoder Beginner Contest 303 E - A Gift From the Stars

原题链接:

E - A Gift From the Stars

题面:

在这里插入图片描述

题意

就是给你一个图,是这样构成的:有多个如右图这种在这里插入图片描述,星型的,然后两个之间只能在度为1的点之间连接一条边,让你把原来的星型图还原出来。

思路

一开始想简单了,从度最大的开始以此bfs,发现不对;发现只能在两个度为1的点之间连接一条边,那么相邻的两个星型图中间点距离应该为3,如右图在这里插入图片描述
,很容易确定度唯为1的点连接的点就是一个星点,从此开始dfs找到距离是3的倍数即可即可。

代码

const int N = 2e5+100;
vector<int> g[N];
int d[N];
bool vis[N];
void solve(){
    int n; cin >> n;
    for(int i = 1; i < n; i++) {
        int u, v; cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
        ++ d[u], ++ d[v];
    }

    int sta = 0;
    for(int i = 1; i <= n; i++) if(d[i] == 1) sta = i;

    vector<int> te, ans;
    function<void(int, int)> dfs = [&](int n, int de) {
        vis[n] = 1;
        if(de % 3 == 0) te.push_back(n);
        for(auto i:g[n]) {
            if(vis[i]) continue;
            dfs(i, de + 1);
        }
    };
    dfs(g[sta][0], 0);
    for(auto &i:te) {
        ans.push_back(g[i].size());
    }
    sort(all(ans));
    for(auto i:ans) cout << i << ' ';
    cout << '\n';
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值