【掩体计划——DFS+缩点】

题目

代码

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
vector<vector<int>> g;
bool st[N];
int ans = 1e9;
bool dfs(int f, int u, int dis)
{
    bool is = 1;
    for (auto j : g[u])
    {
        if (j == f)
            continue;
        is &= dfs(u, j, dis + (g[u].size() > 2));
    }

    if (g[u].size() == 1) // 无向图叶子节点判定
        is = st[u];
    if (is)
        ans = min(ans, dis);
    return is;
}
int main()
{
    int n;
    cin >> n;

    g.resize(n + 1);
    for (int i = 1; i < n; i++)
    {
        int a, b;
        cin >> a >> b;
        g[a].push_back(b);
        g[b].push_back(a);
    }

    g[1].push_back(-1); // 为了统一那个多出来的父节点
    int m;
    cin >> m;
    for (int i = 1; i <= m; i++)
    {
        int x;
        cin >> x;
        st[x] = 1;
    }

    dfs(-1, 1, 0);

    cout << ans;
    return 0;
}
相关推荐
jyan_敬言13 小时前
【算法】高精度算法(加减乘除)
c语言·开发语言·c++·笔记·算法
树獭叔叔13 小时前
内存价格被Google打下来了?: TurboQuant对KVCache的量化
算法·aigc·openai
旖-旎13 小时前
前缀和(矩阵区域和)(8)
c++·算法·leetcode·前缀和·动态规划
月落归舟13 小时前
排序算法---(一)
数据结构·算法·排序算法
liuyao_xianhui13 小时前
优选算法_翻转链表_头插法_C++
开发语言·数据结构·c++·算法·leetcode·链表·动态规划
Book思议-13 小时前
【数据结构实战】循环队列FIFO 特性生成六十甲子(天干地支纪年法),实现传统文化里的 “时间轮回”
数据结构·算法·
im_AMBER13 小时前
Leetcode 147 零钱兑换 | 单词拆分
javascript·学习·算法·leetcode·动态规划
zl_vslam14 小时前
SLAM中的非线性优-3D图优化之IMU预积分SE3推导(二十一)
人工智能·算法·计算机视觉·3d
c++逐梦人14 小时前
DFS经典例题(八皇后,数独)
算法·蓝桥杯·深度优先
进击的小头14 小时前
第18篇:PID参数整定与裕度优化的现场调试实战
python·算法