Gym - 102920 C - Dessert Café (思维)

题意:一棵n个点的树上有k个特殊点,问满足以下条件的点a的个数:

(1)到某个特殊点b的距离小于除a, b外的点到b的距离

(2)到某个特殊点c的距离小于b到c的距离

思路:求任意两个特殊点之间路径上点的个数

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const ll mod = 1e9 + 7;
const int N = 1e5 + 7;

vector<int>mp[N];
int n, k;
bool vis[N], is[N];

bool dfs(int u, int fa) {
    bool flag = 0;
    int siz = mp[u].size();
    for(int i = 0; i < siz; ++i) {
        int v = mp[u][i];
        if(v == fa) continue;
        if(dfs(v, u) || vis[v]) is[v] = 1, flag = 1;
    }
    if(flag) is[u] = 1;
    return is[u];
}

int main() {
    int u, v, w;
    scanf("%d%d", &n, &k);
    for(int i = 1; i < n; ++i) {
        scanf("%d%d%d", &u, &v, &w);
        mp[u].emplace_back(v);
        mp[v].emplace_back(u);
    }
    for(int i = 1; i <= k; ++i) {
        scanf("%d", &u);
        vis[u] = 1;
    }
    int cnt = 0;
    for(int i = 1; i <= n; ++i) {
        if(vis[i]) {
            dfs(i, 0);
            break;
        }
    }
    for(int i = 1; i <= n; ++i) if(is[i] || vis[i]) cnt++;
    printf("%d\n", cnt);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43871207/article/details/113472023