Submission #166438

#TimeUsernameProblemLanguageResultExecution timeMemory
166438dolphingarlic007 (CEOI14_007)C++14
0 / 100
810 ms23928 KiB
#include <bits/stdc++.h>
#define FOR(i, x, y) for (int i = x; i < y; i++)
typedef long long ll;
using namespace std;

vector<int> graph[200001];
int visited[200001], reachable[200001];

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n, m, s, d, a, b;
    cin >> n >> m >> s >> d >> a >> b;
    FOR(i, 0, m) {
        int a, b;
        cin >> a >> b;
        graph[a].push_back(b);
        graph[b].push_back(a);
    }

    memset(visited, -1, sizeof(visited));
    queue<int> q;
    visited[s] = 0;
    q.push(s);
    while (q.size()) {
        int curr = q.front();
        q.pop();
        for (int i : graph[curr]) {
            if (!(~visited[i])) {
                q.push(i);
                visited[i] = visited[curr] + 1;
            }
        }
    }

    int l = 0, r = 1000000;
    while (l != r) {
        int mid = (l + r + 1) / 2;
        memset(reachable, -1, sizeof(reachable));
        queue<int> q;
        reachable[d] = 0;
        q.push(d);
        while (q.size()) {
            int curr = q.front();
            q.pop();
            for (int i : graph[curr]) {
                if (!(~reachable[i]) && reachable[curr] + 1 < visited[i] + mid) {
                    reachable[i] = reachable[curr] + 1;
                    q.push(i);
                }
            }
        }

        if (~reachable[a] || ~reachable[b]) r = mid - 1;
        else l = mid;
    }

    memset(reachable, -1, sizeof(reachable));
    reachable[d] = 0;
    q.push(d);
    while (q.size()) {
        int curr = q.front();
        q.pop();
        for (int i : graph[curr]) {
            if (!(~reachable[i]) && reachable[curr] + 1 < visited[i] + l) {
                reachable[i] = reachable[curr] + 1;
                q.push(i);
            }
        }
    }

    if (~reachable[a] || ~reachable[b]) cout << -1;
    else cout << l;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...