求助,DFS TLE后四个而BFS全对
查看原帖
求助,DFS TLE后四个而BFS全对
409774
Maysoul楼主2023/5/15 10:36

这是DFS

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+10;
int num,ans;
vector<vector<int>> vec;
int du[600000][2];
void dfs(int a,int step)
{
	for (int i:vec[a])
	{
		if(step%2==0&&step<du[i][1])
		{
			du[i][1]=step;
			dfs(i,step+1);
		}
		if(step%2==1&&step<du[i][0])
		{
			du[i][0]=step;
			dfs(i,step+1);
		}
		
	}
}
int main()
{
	int n,m,q;
	std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	cin>>n>>m>>q;
	vec.resize(n+1);
	for (int i=1;i<=m;i++)
	{
		int x,y;
		cin>>x>>y;
		vec[x].push_back(y);
		vec[y].push_back(x);
	}
	memset(du,0x3f,sizeof(du));
	dfs(1,1);
	for (int i=1;i<=q;i++)
	{
		int op,ed;
		cin>>op>>ed;
		if(ed%2==0) 
		{
			if(du[op][1]>ed) cout<<"No"<<endl;
			else cout<<"Yes"<<endl;
		}
		else 
		{
			if(du[op][0]>ed) cout<<"No"<<endl;
			else cout<<"Yes"<<endl;
		}
	}
	return 0;

}

这是BFS(主函数不变):

void bfs()
{
	queue<int> que;
	int step=1;
	for (int i:vec[1])
	{
		du[i][0]=step;
		que.push(i);
	}
	while(que.size())
	{
		int cnt=que.size();
		step++;
		while(cnt--)
		{
			int cp=que.front();
			que.pop();
			for (int i:vec[cp])
			{
				if(step%2==0&&step<du[i][1])
				{
					du[i][1]=step;
					que.push(i);
				}
				if(step%2==1&&step<du[i][0])
				{
					du[i][0]=step;
					que.push(i);
				}
			} 
		}
	}
}

到底哪里有区别?

2023/5/15 10:36
加载中...