Submission #90801

#TimeUsernameProblemLanguageResultExecution timeMemory
90801FutymyClone007 (CEOI14_007)C++14
100 / 100
346 ms18364 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 2e5 + 5;

int n, m, s, d, a, b, ans1 = 0, ans2 = 0, d1[N], d2[N], d3[N], d4[N];
vector <int> g[N];

void bfs1(){
    memset(d1, 0x3f, sizeof(d1)); queue <int> q;
    d1[a] = 0; q.push(a);
    while (!q.empty()) {
        int u = q.front(); q.pop();
        for (auto v: g[u]) {
            if (d1[v] > 1e9) {
                d1[v] = d1[u] + 1;
                q.push(v);
            }
        }
    }
}

void bfs2(){
    memset(d2, 0x3f, sizeof(d2)); queue <int> q;
    d2[b] = 0; q.push(b);
    while (!q.empty()) {
        int u = q.front(); q.pop();
        for (auto v: g[u]) {
            if (d2[v] > 1e9) {
                d2[v] = d2[u] + 1;
                q.push(v);
            }
        }
    }
}

void bfs3(){
    memset(d3, 0x3f, sizeof(d3));
    queue <int> q; q.push(s); d3[s] = 0;
    while (!q.empty()) {
        int u = q.front(); q.pop();
        ans1 = max(ans1, d3[u]);
        for (auto v: g[u]) {
            if (d3[v] > 1e9 && (d1[v] == d1[u] - 1 && d2[v] == d2[u] - 1)) {
                d3[v] = d3[u] + 1;
                q.push(v);
            }
        }
    }
}

void bfs4(){
    memset(d4, 0x3f, sizeof(d4));
    queue <int> q; q.push(d); d4[d] = 0;
    while (!q.empty()) {
        int u = q.front(); q.pop();
        ans2 = max(ans2, d4[u]);
        for (auto v: g[u]) {
            if (d4[v] > 1e9 && (d1[v] == d1[u] - 1 && d2[v] == d2[u] - 1)) {
                d4[v] = d4[u] + 1;
                q.push(v);
            }
        }
    }
}

int main(){
    scanf("%d %d", &n, &m);
    scanf("%d %d %d %d", &s, &d, &a, &b);
    for (int i = 1; i <= m; i++) {
        int u, v;
        scanf("%d %d", &u, &v);
        g[u].push_back(v); g[v].push_back(u);
    }

    bfs1(); bfs2();
    if (d1[d] - d1[s] != d2[d] - d2[s]) printf("%d", max(min(d1[d] - d1[s], d2[d] - d2[s]), -1));
    else {
        bfs3(); bfs4();
        printf("%d", max(d1[d] - d1[s] - ((d1[d] - d1[s] + ans1) < ans2), -1));
    }
    return 0;
}
/*
6 6
1 2 3 4
1 5
5 6
6 3
6 4
1 2
3 4

6 7
5 6 1 2
6 3
1 2
1 3
2 3
1 5
2 4
5 4
*/

Compilation message (stderr)

007.cpp: In function 'int main()':
007.cpp:69:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d", &n, &m);
     ~~~~~^~~~~~~~~~~~~~~~~
007.cpp:70:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d %d %d", &s, &d, &a, &b);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
007.cpp:73:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d", &u, &v);
         ~~~~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...