其他分享
首页 > 其他分享> > CF986A

CF986A

作者:互联网

今天中午把这个写了,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

标签:nxt,dis2,cur,dis1,int,CF986A,push
来源: https://www.cnblogs.com/Wrasarblogs/p/15337603.html