题目P5663 采用了同时记录奇数和偶数最短路的做法,因为是无权图所以果断bfs,每次询问再用check函数检查是否符合题意
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
const int inf=1e9/3;
int n,m,q;
vector<int> g[maxn];
int dis[maxn][3];//1代表奇数最短路 ,2代表偶数最短路
void bfs(){
queue<int> q;
q.push(1);
int p,len;
while(q.size()>0){
p=q.front();
q.pop();
for(auto pp : g[p]){
if(pp==1) continue;
if(dis[pp][2]==0&&dis[pp][1]!=0){//说明有没有到pp的偶数最短路而有到p的奇数最短路
dis[pp][2]=dis[p][1]+1;
q.push(pp);
}
else if(dis[pp][1]==0&&dis[pp][2]!=0){//说明有没有到pp的奇数最短路而有到p的偶数最短路
dis[pp][1]=dis[p][2]+1;
q.push(pp);
}
}
}
}
void check(int end,int L){
if(L%2==0){
if(dis[end][2]<=L&&(L-dis[end][2])%2==0){
cout<<"Yes"<<"\n";
}
else cout<<"No"<<"\n";
}
else if(L%2==1){
if(dis[end][1]<=L&&(L-dis[end][1])%2==0){
cout<<"Yes"<<"\n";
}
else cout<<"No"<<"\n";
}
}
int main(){
cin>>n>>m>>q;
int a,b;
for(int i=1;i<=m;i++){
cin>>a>>b;
g[a].push_back(b);
g[b].push_back(a);
}
bfs();
for(int i=1;i<=n;i++){
cout<<dis[i][1]<<" "<<dis[i][2]<<"\n";
}
cout<<"\n";
for(int i=1;i<=q;i++){
cin>>a>>b;
check(a,b);
//cout<<dis[a][1]<<" "<<dis[a][2]<<"\n";
}
return 0;
}