垃圾
2024-07-22 18:53:56
发布于:广东
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
using namespace std;
const int MAXNMQ=100005;
vector<int> s[MAXNMQ];
int dp[MAXNMQ][2]; //分两种情况,为奇数时的最小距离[1]和偶数时的最小距离[0]
int queue[MAXNMQ*10][2], head=0, tail=1;
int main(){
int n, m, q, u, v;
cin >> n >> m >> q;
for(int i=1;i<=m;i++){
cin >> u >> v;
s[u].push_back(v);
s[v].push_back(u);
}
// 初始条件:dp[1]={0,1}
// 搜索条件:dp[v][(dp[u]+1)%2]-1
// 队列格式:{v,dp[u]+1}
memset(dp, -1, sizeof(dp));
dp[1][0]=0, dp[1][1]=-1;
// 初始队列:1的邻居
for(int i=0;i<s[1].size();i++){
queue[tail][0]=s[1][i], queue[tail][1]=1;
tail++,tail%=MAXNMQ*10;
}
// 广搜最短路
while(head!=tail){
int v=queue[head][0], st=queue[head][1];
dp[v][st%2]=st;
for(int i=0;i<s[v].size();i++)
if(dp[s[v][i]][(st+1)%2]-1){
queue[tail][0]=s[v][i], queue[tail][1]=st+1;
tail++,tail%=MAXNMQ10;
}
head++,head%=MAXNMQ10;
}
for(int i=1;i<=q;i++){
int a, l;
cin >> a >> l;
if(s[1].size()==0){
cout << "No" << endl;
continue;
}
if(a==1){
if(l%2==0) cout << "Yes" << endl;
else if(dp[1][1]!=-1&&l>=dp[1][1]) cout << "Yes" << endl;
else cout << "No" << endl;
}else{
if(dp[a][l%2]!=-1&&l>=dp[a][l%2]) cout << "Yes" << endl;
else cout << "No" << endl;
}
}
return 0;
}
这里空空如也
有帮助,赞一个