Guest User

Untitled

a guest
Jan 4th, 2018
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.91 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <vector>
  4. #include <queue>
  5. #include <cstring>
  6. #include <map>
  7.  
  8. using namespace std;
  9.  
  10. #define DIM 8000
  11.  
  12. int N, M, x, y;
  13.  
  14. vector <vector <int> > G;
  15. vector <vector <int> > D;
  16. queue <pair <int, int> > Q;
  17. int was[DIM];
  18. map <int, vector <int> > myMap;
  19. vector <int> ans;
  20.  
  21. void BF(int, int, int);
  22.  
  23. int main() {
  24. freopen("graf.in","r",stdin);
  25. freopen("graf.out","w",stdout);
  26.  
  27. scanf("%d %d %d %d\n", &N, &M, &x, &y);
  28.  
  29. G.resize(N + 1);
  30. D.resize(2, vector <int> (N + 1));
  31.  
  32. int a, b;
  33. for(int i = 1; i <= M; ++i) {
  34. scanf("%d %d\n", &a, &b);
  35.  
  36. G[a].push_back(b);
  37. G[b].push_back(a);
  38. }
  39.  
  40. Q.push(make_pair(x, 0));
  41. was[x] = 1;
  42. BF(x, 0, 0);
  43. memset(was, 0, sizeof(was));
  44. was[y] = 1;
  45. Q.push(make_pair(y, 0));
  46. BF(y, 0, 1);
  47.  
  48. int mn = 2e9;
  49.  
  50. for(int i = 1; i <= N; ++i) {
  51. if(mn > D[0][i] + D[1][i]) {
  52. mn = D[0][i] + D[1][i];
  53. }
  54. }
  55.  
  56. for(int i = 1; i <= N; ++i) {
  57. if(mn == D[0][i] + D[1][i]) {
  58. myMap[D[0][i]].push_back(i);
  59. }
  60. }
  61.  
  62. for(int i = 1; i <= N; ++i) {
  63. if(mn == D[0][i] + D[1][i]) {
  64. if(myMap[D[0][i]].size() == 1) {
  65. ans.push_back(myMap[D[0][i]][0]);
  66. }
  67. }
  68. }
  69.  
  70. cout << ans.size() << '\n';
  71.  
  72. for(unsigned int z = 0;z < ans.size(); ++z) {
  73. cout << ans[z] << ' ';
  74. }
  75.  
  76. cout << '\n';
  77.  
  78. return 0;
  79. }
  80.  
  81. void BF(int node, int dist, int root) {
  82. if(Q.empty()) {
  83. return ;
  84. }
  85.  
  86. Q.pop();
  87.  
  88. D[root][node] = dist;
  89.  
  90. for(unsigned int z = 0; z < G[node].size(); ++z) {
  91. if(!was[G[node][z]]) {
  92. Q.push(make_pair(G[node][z], dist + 1));
  93. was[G[node][z]] = 1;
  94. }
  95. }
  96.  
  97. node = Q.front().first;
  98. dist = Q.front().second;
  99.  
  100. BF(node, dist, root);
  101. }
Advertisement
Add Comment
Please, Sign In to add comment