1 solutions

  • 1
    @ 2025-5-14 22:21:59

    dis[i][j]dis[i][j] 表示节点 jj到恐怖程度不超过 ii的节点的最短距离.因 i100 i \le 100 ,用100100次BFS预处理即可.

    #include <iostream>
    #include <vector>
    #include <queue>
    #include <cstring>
    using namespace std;
    
    const int MAXN = 1e5 + 5, MAXM = 105;
    const int INF = 0x3f3f3f3f;
    
    int n, m, q;  
    int w[MAXN];
    int dis[MAXM][MAXN]; 
    vector<int> edges[MAXN];
    
    void bfs(int a) { 
        queue<int> que;
        for (int i = 1; i <= n; i++) { 
            if (w[i] <= a) {
                que.push(i);
                dis[a][i] = 0;
            }
        }
    
        while (que.size()) {
            int u = que.front(); que.pop();
            for (auto v : edges[u]) {
                if (dis[a][v] > dis[a][u] + 1) {
                    dis[a][v] = dis[a][u] + 1;
                    que.push(v);
                }
            }
        }
    }
    
    void solve() {
        memset(dis, INF, sizeof(dis));
    
        cin >> n >> m >> q;
        for (int i = 1; i <= n; i++) cin >> w[i];
        while (m--) {
            int u, v; cin >> u >> v;
            edges[u].push_back(v), edges[v].push_back(u);
        }
    
        for (int i = 1; i <= 100; i++) bfs(i); 
    
        while (q--) {
            int p, a; cin >> p >> a;
            cout << (dis[a][p] == INF? -1 : dis[a][p]) << endl;
        }
    }
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        solve();
        return 0;
    }
    
    • 1

    Information

    ID
    1475
    Time
    3000ms
    Memory
    256MiB
    Difficulty
    7
    Tags
    (None)
    # Submissions
    60
    Accepted
    15
    Uploaded By