fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. #include <tuple>
  5. using namespace std;
  6.  
  7. tuple<vector<int>, vector<int>, vector<long long>>
  8. bfsShortestMaxFiveCount(int n, const vector<vector<int>>& g, const vector<int>& val) {
  9. vector<int> dist(n+1, -1), max5(n+1, -1);
  10. vector<long long> ways(n+1, 0);
  11. queue<int> q;
  12.  
  13. dist[1] = 0;
  14. max5[1] = (val[1] == 5 ? 1 : 0);
  15. ways[1] = 1;
  16. q.push(1);
  17.  
  18. while (!q.empty()) {
  19. int v = q.front(); q.pop();
  20. for (int u : g[v]) {
  21. int add = (val[u] == 5 ? 1 : 0);
  22. if (dist[u] == -1) { // first time: shortest
  23. dist[u] = dist[v] + 1;
  24. max5[u] = max5[v] + add;
  25. ways[u] = ways[v];
  26. q.push(u);
  27. } else if (dist[u] == dist[v] + 1) { // another shortest path
  28. int cand5 = max5[v] + add;
  29. if (cand5 > max5[u]) { // better 5-count replaces
  30. max5[u] = cand5;
  31. ways[u] = ways[v];
  32. } else if (cand5 == max5[u]) { // tie: add ways
  33. ways[u] += ways[v];
  34. }
  35.  
  36. }
  37.  
  38. }
  39. }
  40. return {dist, max5, ways};
  41. }
  42.  
  43. int main() {
  44. int n, m;
  45. cin >> n >> m;
  46.  
  47. vector<int> val(n+1);
  48. for (int i = 1; i <= n; ++i) cin >> val[i];
  49.  
  50. vector<vector<int>> g(n+1);
  51. for (int i = 0; i < m; ++i) {
  52. int u, v; cin >> u >> v;
  53. g[u].push_back(v);
  54. g[v].push_back(u);
  55. }
  56.  
  57. auto [dist, max5, ways] = bfsShortestMaxFiveCount(n, g, val);
  58.  
  59.  
  60. for (int i = 1; i <= n; ++i) {
  61. cout << dist[i] << " " << max5[i] << " " << ways[i] << "\n";
  62. }
  63. return 0;
  64. }
  65.  
Success #stdin #stdout 0.01s 5284KB
stdin
5 6
5 0 5 0 5
1 2
1 3
2 4
3 4
2 5
3 5
stdout
0 1 1
1 1 1
1 2 1
2 2 1
2 3 1