https://coderun.yandex.ru/problem/robots/description Сложная

Решение

import java.util.Scanner;
import java.util.Arrays;
import java.io.PrintWriter;
import java.io.IOException;

public class Solution {
    static int n, k, nr;
    static int[][][] m = new int[401][401][2];
    static int[][] l = new int[401][401];
    static int[] r = new int[401];
    static int[] a = new int[20001];
    static int[] b = new int[20001];

    static boolean[] u = new boolean[401];
    static int[] o = new int[1000001];

    static boolean[][] s = new boolean[401][401];

    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        PrintWriter out = new PrintWriter(System.out);

        n = sc.nextInt();
        for (int i = 1; i <= 400; i++) {
            for (int j = 1; j <= 400; j++) {
                m[i][j][0] = m[i][j][1] = 1000_000;
            }
        }
        k = sc.nextInt();
        for (int i = 1; i <= n; i++) {
            m[i][i][0] = 0;
        }
        for (int i = 1; i <= k; i++) {
            a[i] = sc.nextInt();
            b[i] = sc.nextInt();
            s[a[i]][b[i]] = true;
            s[b[i]][a[i]] = true;
        }

        for (int i = 1; i <= n; i++) {
            l[i][0] = 0;
            for (int j = 1; j <= n; j++) {
                if (s[i][j]) {
                    ++l[i][0];
                    l[i][l[i][0]] = j;
                }
            }
        }

        nr = sc.nextInt();
        for (int i = 1; i <= nr; i++) {
            r[i] = sc.nextInt();
        }

        for (int i = 1; i <= nr; i++) {
            bfs(r[i]);
        }

        int an = 1000000;
        for (int i = 1; i <= k; i++) {
            int c = 0;
            for (int j = 1; j <= nr; j++) {
                c = Math.max(c, Math.min(Math.min(m[r[j]][a[i]][0], m[r[j]][a[i]][1]),
                        Math.min(m[r[j]][b[i]][0], m[r[j]][b[i]][1])) + 1);
            }
            an = Math.min(an, c);
        }
        for (int i = 1; i <= n; i++) {
            int lc = 0;
            int ln = 0;
            for (int j = 1; j <= nr; j++) {
                lc = Math.max(lc, m[r[j]][i][0]);
                ln = Math.max(ln, m[r[j]][i][1]);
            }
            an = Math.min(an, Math.min(lc, ln));
        }

        if (an < 100000) {
            double minTimeForAllRobots = (double) an / 2.0;
            double reminder = minTimeForAllRobots % 1;
            if (reminder == 0.0) {
                System.out.println((int) minTimeForAllRobots);
            } else {
                System.out.println(minTimeForAllRobots);
            }
        } else {
            out.println("-1");
        }

        sc.close();
        out.close();
    }

    static void bfs(int v) {
        Arrays.fill(u, false);
        int p1 = 1;
        int p2 = 1;
        o[p1] = v;
        u[v] = true;
        while (p1 <= p2) {
            int cv = o[p1++];
            u[cv] = false;
            for (int i = 1; i <= l[cv][0]; i++) {
                if (m[v][l[cv][i]][0] > m[v][cv][1] + 2) {
                    m[v][l[cv][i]][0] = m[v][cv][1] + 2;
                    if (!u[l[cv][i]]) {
                        u[l[cv][i]] = true;
                        o[++p2] = l[cv][i];
                    }
                }
                if (m[v][l[cv][i]][1] > m[v][cv][0] + 2) {
                    m[v][l[cv][i]][1] = m[v][cv][0] + 2;
                    if (!u[l[cv][i]]) {
                        u[l[cv][i]] = true;
                        o[++p2] = l[cv][i];
                    }
                }
            }
        }
    }
}