Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <vector>
- #include <queue>
- #include <cstring>
- #include <map>
- using namespace std;
- #define DIM 8000
- int N, M, x, y;
- vector <vector <int> > G;
- vector <vector <int> > D;
- queue <pair <int, int> > Q;
- int was[DIM];
- map <int, vector <int> > myMap;
- vector <int> ans;
- void BF(int, int, int);
- int main() {
- freopen("graf.in","r",stdin);
- freopen("graf.out","w",stdout);
- scanf("%d %d %d %d\n", &N, &M, &x, &y);
- G.resize(N + 1);
- D.resize(2, vector <int> (N + 1));
- int a, b;
- for(int i = 1; i <= M; ++i) {
- scanf("%d %d\n", &a, &b);
- G[a].push_back(b);
- G[b].push_back(a);
- }
- Q.push(make_pair(x, 0));
- was[x] = 1;
- BF(x, 0, 0);
- memset(was, 0, sizeof(was));
- was[y] = 1;
- Q.push(make_pair(y, 0));
- BF(y, 0, 1);
- int mn = 2e9;
- for(int i = 1; i <= N; ++i) {
- if(mn > D[0][i] + D[1][i]) {
- mn = D[0][i] + D[1][i];
- }
- }
- for(int i = 1; i <= N; ++i) {
- if(mn == D[0][i] + D[1][i]) {
- myMap[D[0][i]].push_back(i);
- }
- }
- for(int i = 1; i <= N; ++i) {
- if(mn == D[0][i] + D[1][i]) {
- if(myMap[D[0][i]].size() == 1) {
- ans.push_back(myMap[D[0][i]][0]);
- }
- }
- }
- cout << ans.size() << '\n';
- for(unsigned int z = 0;z < ans.size(); ++z) {
- cout << ans[z] << ' ';
- }
- cout << '\n';
- return 0;
- }
- void BF(int node, int dist, int root) {
- if(Q.empty()) {
- return ;
- }
- Q.pop();
- D[root][node] = dist;
- for(unsigned int z = 0; z < G[node].size(); ++z) {
- if(!was[G[node][z]]) {
- Q.push(make_pair(G[node][z], dist + 1));
- was[G[node][z]] = 1;
- }
- }
- node = Q.front().first;
- dist = Q.front().second;
- BF(node, dist, root);
- }
Advertisement
Add Comment
Please, Sign In to add comment