#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define pii pair<ld,ld>
#define f first
#define s second
#define chmin(a, b) a = min(a,b)
#define chmax(a, b) a = max(a,b)
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define F0R(i, a) for (int i = 0; i < (a); i++)
#define all(x) x.begin(),x.end()
#define vec vector
const int N = 2e5;
int d_007[N], d_null[N], d_a[N], d_b[N];
vec<int> adj[N];
int main() {
    ios::sync_with_stdio(false); cin.tie(0);
    int n, m; cin >> n >> m;
    int s, d, a, b; cin >> s >> d >> a >> b;
    for (int i=0;i<m;i++) {
        int a1, b1; cin >> a1 >> b1;
        adj[--a1].pb(--b1);
        adj[b1].pb(a1);
    }
    for (int i=0;i<n;i++) {d_007[i] = d_null[i] = d_a[i] = d_b[i] = INT_MAX;}
    auto bfs = [&](int* dist, int src) {
        queue<int> q;
        q.push(src); dist[src] = 0;
        while (q.size()) {
            int cur = q.front(); q.pop();
            for (int x : adj[cur]) {
                if (dist[x]==INT_MAX) {
                    dist[x] = dist[cur]+1;
                    q.push(x);
                }
            }
        }
    };
    bfs(d_007,--s); bfs(d_null,--d); bfs(d_a,--a); bfs(d_b,--b);
    int ans = -1;
    if (d_007[a]!=d_007[b]) {
        chmax(ans,min(d_null[a]-d_007[a],d_null[b]-d_007[b]));
    } else {
        if (d_null[a]!=d_null[b]) {
            chmax(ans,min(min(d_null[a],d_null[b])-d_007[a],max(d_null[a],d_null[b])-d_007[a]-1));
        } else {
            int split_null = -1, split_007 = -1;
            for (int i=0;i<n;i++) {
                if (d_a[i]==d_b[i]) {
                    if (d_a[i]+d_null[i]==d_null[a]) {
                        if (split_null==-1 || d_a[i]<d_a[split_null]) {
                            split_null = i;
                        }
                    }
                    if (d_a[i]+d_007[i]==d_007[a]) {
                        if (split_007==-1 || d_a[i]<d_a[split_007]) {
                            split_007 = i;
                        }
                    }
                }
            }
            chmax(ans,d_null[a]-d_007[a]-1);
            
            if (d_a[split_007]<=d_a[split_null]) {
                chmax(ans,d_null[a]-d_007[a]);
            }
        }
    } cout << ans << '\n';
    /*
    bfs
    if times for 007 are off by 1
    then only one route, so check for both server
    if times are the same:
    if times for null are not the same as these: take smaller time for null
    if all four times are the same:
    do the bfs from both servers to find best split points for 007 and null, and compare them
    */
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |