Gym-102920 C-Café de postres (pensando)

 

Pregunta: Hay k puntos especiales en un árbol con n puntos. Pregunte el número de puntos a que cumplen las siguientes condiciones:

(1) La distancia a un punto especial b es menor que la distancia desde puntos distintos de a, b ab

(2) La distancia a un punto especial c es menor que la distancia de b a c

Idea: Encuentre el número de puntos en el camino entre dos puntos especiales

#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;
}

 

Supongo que te gusta

Origin blog.csdn.net/weixin_43871207/article/details/113472023
Recomendado
Clasificación