#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 1e5 + 5, maxm = 2e3 + 5, inf = 1e9;
int a[maxn], w[maxn];
vector<int> G[maxn];
int n;
int f[maxn][105];//f[i][j]表示结点i到辣度为j的结点的最小距离
void bfs(int a){
queue<int> q;
for(int i = 1; i <= n; i++){
if(w[i] == a){
f[i][a] = 0;
q.push(i);
}
}
while(!q.empty()){
int u = q.front();
q.pop();
for(auto v : G[u]){
if(f[u][a] + 1 < f[v][a]){
f[v][a] = f[u][a] + 1;
q.push(v);
}
}
}
}
void solve(){
int m, q;
cin >> n >> m >> q;
for(int i = 1; i <= n; i++){
cin >> w[i];
}
for(int i = 1; i <= m; i++){
int u, v;
cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
// memset(f, 0x3f, sizeof(f));
for(int i = 1; i <= n; i++){
for(int j = 1; j <= 100; j++){
f[i][j] = inf;
}
}
for(int i = 1; i <= 100; i++){
bfs(i);
}
for(int i = 1; i <= n; i++){
for(int j = 2; j <= 100; j++){
f[i][j] = min(f[i][j], f[i][j - 1]);
}
}
while(q--){
int p, a;
cin >> p >> a;
if(f[p][a] != inf) cout << f[p][a] << '\n';
else cout << -1 << '\n';
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int T = 1;
// cin >> T;
while(T--){
solve();
}
}
n个结点,每个结点有一个辣度,q次询问:结点p到辣度小于等于a(0 <= a <= 100)的结点的最短距离是多少
于 2024-01-15 18:43:37 首次发布