今天中午把这个写了,BFS就可以收尾了。
再也不可以咕到明天了!再咕我就是大鸽子!
进入正文:
有一定难度的BFS!
说白了,有难度的BFS就只有这几种情况吧(个人认为):
1.需要逆向解决(即多起点单终点)
经典例子:P1332 血色先锋队
2.不一样的障碍物(如动态,传送门等)
经典例子:P1825 [USACO11OPEN]Corn Maze S,P2895 [USACO08FEB]Meteor Shower S
3.需要分奇偶来算
经典例子:P5663 [CSP-J2019] 加工零件,CF986A Fair
有一定难度的BFS例题!
主要是分奇偶的有点难度,其他还好吧。
1.P5663 [CSP-J2019] 加工零件
水乎?水哉,水哉!
分奇偶算就珂以了。
#include<bits/stdc++.h>
using namespace std;
int n,m,q,u,v,a,L,dis1[100010],dis2[100010];
vector<int> Gragh[100010];
void bfs(int sx){
memset(dis1,0x3f,sizeof(dis1));
memset(dis2,0x3f,sizeof(dis2));
dis2[sx]=0;
queue<int> q;
q.push(sx);
while(q.empty()==0){
int cur=q.front();
q.pop();
for(int i=0;i<Gragh[cur].size();i++){
int nxt=Gragh[cur][i];
if(dis1[nxt]>dis2[cur]+1){
dis1[nxt]=dis2[cur]+1;
q.push(nxt);
}
if(dis2[nxt]>dis1[cur]+1){
dis2[nxt]=dis1[cur]+1;
q.push(nxt);
}
}
}
}
int main() {
cin>>n>>m>>q;
for(int i=1;i<=m;i++){
cin>>u>>v;
Gragh[u].push_back(v);
Gragh[v].push_back(u);
}
bfs(1);
for(int i=1;i<=q;i++){
cin>>a>>L;
if(L%2==1&&L>=dis1[a]){
cout<<"Yes"<<"\n";
}
else if(L%2==0&&L>=dis2[a]){
cout<<"Yes"<<"\n";
}
else{
cout<<"No"<<"\n";
}
}
return 0;
}
2.CF986A Fair
详情请看未审核题解:CF986A Fair