题意
有n个点 n-1个点组成一个迷宫
有k个朋友分别在迷宫中的不同的点里面
Vlad需要从这个迷宫中逃脱
每个人同时移动速度相同
如果Vlad碰到了他的朋友他就逃脱失败
如果他能先到达一个点(只要有一条边的,且非1点)
他就成功逃脱
如果不能成功逃脱
输出最小需要几个朋友
如果能逃脱输出-1
思路
就是判断朋友和Vlad谁先能够到达 特殊的点嘛
树上多源最短路应该就是说
BFS就可以解决
把哪个点先被人到达那个点就是那个人的点
AC代码
#include<bits/stdc++.h>
#define endl "\n"
#define INF 0x3f3f3f3f3f3f3f
typedef long long ll;
const ll mod = 1e9 + 7;
const double PI = acos(-1.0);
const double EI = exp(1.0);
const int N = 2e5 + 50;
const int maxn = 2 * N;
const double eps = 1e-8;
using namespace std;
vector<int>v[N];
int vis[N];
int n, k;
void solve()
{
cin >> n >> k;
for (int i = 1; i <= n; i++)
{
v[i].clear();
vis[i] = 0;
}
queue<int>q;
set<int>s;
for (int i = 1; i <= k; i++)
{
int x;
cin >> x;
q.push(x);
vis[x] = x;
}
vis[1] = 1;
q.push(1);
for (int i = 1; i <= n-1; i++)
{
int x, y;
cin >> x >> y;
v[x].push_back(y);
v[y].push_back(x);
}
while (!q.empty())
{
int now = q.front();
q.pop();
for (auto t : v[now])
{
if (vis[t] == 0)
{
vis[t] = vis[now];
q.push(t);
}
else if (vis[t] == 1 && vis[now] != 1)
{
s.insert(vis[now]);
}
}
}
for(int i=1;i<=n;i++)
if (v[i].size() == 1 && vis[i] == 1&&i!=1)
{
cout << -1 << endl;
return;
}
cout << s.size() << endl;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(); cout.tie(0);
int t; cin >> t; while (t--)
solve();
return 0;
}