Java
import java.io.*;
import java.util.*;
public class Main {
    static final int N = 1010;
    static final int INF = 0x3f3f3f3f;
    static int n, m;
    static int[][] g = new int[N][N];
    static int[] seq = new int[N];
    static int[] dist = new int[N];
    static boolean[] visited = new boolean[N];
    static boolean checkDijkstra() {
        Arrays.fill(dist, INF);
        Arrays.fill(visited, false);
        dist[seq[0]] = 0;
        for (int i = 0; i < n; i++) {
            int current = seq[i];
            for (int j = 1; j <= n; j++) {
                if (!visited[j] && dist[j] < dist[current]) {
                    return false;
                }
            }
            visited[current] = true;
            for (int j = 1; j <= n; j++) {
                if (g[current][j] != INF) {
                    dist[j] = Math.min(dist[j], dist[current] + g[current][j]);
                }
            }
        }
        return true;
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        for (int i = 0; i < N; i++) {
            Arrays.fill(g[i], INF);
        }
        for (int i = 0; i < m; i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            int w = Integer.parseInt(st.nextToken());
            g[a][b] = g[b][a] = Math.min(g[a][b], w);
        }
        int k = Integer.parseInt(br.readLine());
        while (k-- > 0) {
            st = new StringTokenizer(br.readLine());
            for (int i = 0; i < n; i++) {
                seq[i] = Integer.parseInt(st.nextToken());
            }
            System.out.println(checkDijkstra() ? "Yes" : "No");
        }
    }
}
C++
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010, INF = 0x3f3f3f3f;
int n, m;    // [1, n]
int g[N][N], seq[N];
int dist[N];
bool st[N];
bool dijkstra() {
    memset(dist, 0x3f, sizeof dist);
    memset(st, false, sizeof st);
    dist[seq[0]] = 0;
    for (int i = 0; i < n; ++i) {
        int t = seq[i];
        for (int j = 1; j <= n; ++j)
            if (!st[j] && dist[j] < dist[t])
                return false;
        st[t] = true;
        for (int j = 1; j <= n; ++j)
            dist[j] = min(dist[j], dist[t] + g[t][j]);
    }
    return true;
}
int main() {
    memset(g, 0x3f, sizeof g);
    scanf("%d%d", &n, &m);
    for (int i = 0; i < m; ++i) {
        int a, b, w;
        scanf("%d%d%d", &a, &b, &w);
        g[a][b] = g[b][a] = min(g[a][b], w);
    }
    int k;
    scanf("%d", &k);
    while (k--) {
        for (int i = 0; i < n; ++i) scanf("%d", &seq[i]);
        if (dijkstra()) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}