fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. using namespace std;
  5.  
  6. pair<vector<int>, vector<int>>
  7. bfsMaxFive(int n, const vector<vector<int>>& g, const vector<int>& val) {
  8. vector<int> dist(n+1, -1), five(n+1, -1);
  9. queue<int> q;
  10. dist[1] = 0;
  11. five[1] = (val[1] == 5 ? 1 : 0);
  12. q.push(1);
  13.  
  14. while (!q.empty()) {
  15. int v = q.front(); q.pop();
  16. for (int u : g[v]) {
  17. int add = (val[u] == 5 ? 1 : 0);
  18. if (dist[u] == -1) {
  19. dist[u] = dist[v] + 1;
  20. five[u] = five[v] + add;
  21. q.push(u);
  22. } else if (dist[u] == dist[v] + 1) {
  23. if (five[v] + add > five[u]) five[u] = five[v] + add;
  24. }
  25. }
  26. }
  27. return {dist, five};
  28. }
  29.  
  30. int main() {
  31. int n, m;
  32. cin >> n >> m;
  33.  
  34. vector<int> val(n+1);
  35. for (int i = 1; i <= n; ++i) cin >> val[i];
  36.  
  37. vector<vector<int>> g(n+1);
  38. for (int i = 0; i < m; ++i) {
  39. int u, v; cin >> u >> v;
  40. g[u].push_back(v);
  41. g[v].push_back(u);
  42. }
  43.  
  44. auto [dist, five] = bfsMaxFive(n, g, val);
  45.  
  46. int q;
  47. cin >> q; // number of target queries
  48. while (q--) {
  49. int t; cin >> t; // target node
  50. cout << dist[t] << " " << five[t] << "\n";
  51. }
  52. return 0;
  53. }
  54.  
Success #stdin #stdout 0.01s 5320KB
stdin
5 5
5 0 5 0 5
1 2
2 3
1 3
3 4
4 5
3
1
4
5
stdout
0 1
2 2
3 3