Cerința
În țara lui Zoli trăiesc n
persoane, numerotate de la 1
la n
, iar Zoli are numărul de ordine 1
. Zoli s-a săturat de sistemul politic, așa că s-a decis să iasă în stradă. Deoarece Zoli este o persoană sociabilă, are prieteni din diverse cercuri pe care s-a gândit să îi cheme cu el. Zoli își va anunța prietenii, care la rândul lor își vor anunța prietenii și așa mai departe.
Știm însă că unele persoane sunt scandalagii, iar Zoli este un om pașnic și preferă să nu trimită invitația acestora.
Zoli vă cere să îi spuneți numărul de persoane cu care se va întâlni la protest.
Date de intrare
Fișierul de intrare protest.in
conține pe prima linie numărul n
, reprezentând numărul de prieteni și numărul k
, reprezentând numărul de prieteni scandalagii.
A doua linie conține k
numere, reprezentând numerele de ordine ale prietenilor scandalagii.
Următoarele n-1
linii vor conține câte două perechi de numere x y
cu semnificația că persoana cu numărul de ordine x
este prietenă cu persoana ce are numărul de ordine y
.
Date de ieșire
Fișierul de ieșire protest.out
va conține doar numărul nr
, reprezentând numărul de prieteni care i se vor alătura lui Zoli
.
Restricții și precizări
1 ≤ n ≤ 50000
1 ≤ k ≤ 1000
- Numerele de ordine ale scandalagiilor vor fi mai mici decât
n
- Fiecare persoană poate anunța doar prietenii cu care are o legătură directă, rămânând pe seama celor din urmă să transmită invitația mai departe, dacă e posibil.
- Relația de prietenie nu este reciprocă.
Exemplu
protest.in
8 3 4 8 3 1 2 8 5 4 3 1 6 7 5 2 4 4 8
protest.out
2
Explicație
Zoli
va anunța prietenii cu numerele de ordine 2
și 6
.
#include <bits/stdc++.h> using namespace std; ifstream cin("protest.in"); ofstream cout("protest.out"); int n , m , x , y , p[50001] , v , cnt , s; vector <int> G[50001]; void dfs(int d) { p[d] = 1; for(int i :G[d]) if(!p[i]) dfs(i); } int main() { cin >> n >> m; for(int i = 1 ; i <= m ; i++) { cin >> s; p[s] = -1; } for(int i = 1 ; i < n ; i++) { cin >> x >> y; if(p[x] != -1 && p[y] != -1) G[x].push_back(y); } dfs(1); for(int i = 1 ; i <= n ; i++) if(p[i] == 1) cnt++; cout << cnt - 1; }