cin >> t;
pho_restaurants.push_back(t);
}
-// for (int i = 0; i < M; i++)
-// {
-// cout << pho_restaurants[i] << " ";
-// }
-// cout << endl;
map<int,vector<int>> tree;
int a,b;
for (int i = 0; i < M; i++)
{
vector<int> tseen;
- vector<int> c{pho_restaurants[i]};
+ vector<int> c{pho_restaurants[i],0};
vector<vector<int>> temp{c,tseen};
q.push(temp);
}
- vector<int> current, seen;
- vector<vector<int>> temp;
- int last_element;
+ vector<vector<vector<int>>> seen;
+ vector<int> pho_seen,temp3;
+ vector<vector<int>> temp, temp2;
+ int current, length;
while (!q.empty())
{
temp = q.front();
- current = temp[0];
- last_element = current[current.size()-1];
- seen = temp[1];
+
+ current = temp[0][0];
+ length = temp[0][1];
+ pho_seen = temp[1];
q.pop();
- if (find(pho_restaurants.begin(),pho_restaurants.end(),last_element)!= pho_restaurants.end() && find(seen.begin(),seen.end(),last_element)== seen.end())
+ temp3.clear();
+ temp3.push_back(current);
+ temp2.clear();
+ temp2.push_back(temp3);
+ temp2.push_back(pho_seen);
+ if (find(seen.begin(),seen.end(),temp2) != seen.end())
{
- seen.push_back(last_element);
+ continue;
}
-// for (int i = 0; i < current.size(); i++)
-// {
-// cout << current[i] << " ";
-// }
-// cout << endl;
- if (seen.size() == pho_restaurants.size())
+ else
{
- cout << current.size() - 1;
- break;
+ seen.push_back(temp2);
}
- for (int r = 0; r < tree[last_element].size();r++)
+
+ if (find(pho_restaurants.begin(),pho_restaurants.end(),current)!= pho_restaurants.end() && find(pho_seen.begin(),pho_seen.end(),current)== pho_seen.end())
+ {
+ pho_seen.push_back(current);
+ }
+ if (pho_seen.size() == pho_restaurants.size())
{
- vector<int> c(current.begin(), current.end());
- c.push_back(tree[last_element][r]);
- vector<vector<int>> next_value{c,seen};
+ cout << length;
+ return 0;
+ }
+
+ for (int r = 0; r < tree[current].size();r++)
+ {
+ vector<int> c{tree[current][r], length + 1};
+ vector<vector<int>> next_value{c,pho_seen};
q.push(next_value);
}
}
-
return 0;
}
N, M = tuple(map(int,input().split()))
pho_restaurants = tuple(map(int,input().split()))
-
tree = dict()
for i in range(N-1):
a,b = tuple(map(int,input().split()))
q = Queue()
for i in pho_restaurants:
- q.put(([i],set()))
-
+ q.put((i,0, set()))
+seen = set()
while not q.empty():
- current, seen = q.get()
-
- if current[-1] in pho_restaurants:
- seen.add(current[-1])
- # print(current, seen, len(pho_restaurants))
- # if len(current) == 23:
- # quit()
- print(len(current))
- if len(seen) == len(pho_restaurants):
- print(len(current)-1)
+ current, length, pho_seen = q.get()
+ if (current, tuple(pho_seen)) in seen:
+ continue
+ else:
+ seen.add((current,tuple(pho_seen)))
+ if current in pho_restaurants:
+ pho_seen.add(current)
+ if len(pho_seen) == len(pho_restaurants):
+ print(length)
break
- for r in tree[current[-1]]:
- c = current[:]
- c.append(r)
- q.put((c,seen.copy()))
+ for r in tree[current]:
+ q.put((r, length + 1, pho_seen.copy()))