Блог пользователя aa0809

Автор aa0809, история, 4 года назад, По-английски

Hi,

I was working on this problem: https://codeforces.com/contest/771/problem/A

By adding a return in front of my recursive call in the function "dfs2," I was able to get AC on this problem. Can anyone please explain why?

Difference:

bool dfs2(int u)
{
	if(vis[u])
		return false;
	vis[u] = 1;
	if(adj[u].size() != cur_sz - 1)
		return false;
	for(int v : adj[u])
		if(!vis[v])
			dfs2(v);
	return true;
}

as opposed to

bool dfs2(int u)
{
	if(vis[u])
		return false;
	vis[u] = 1;
	if(adj[u].size() != cur_sz - 1)
		return false;
	for(int v : adj[u])
		if(!vis[v])
			return dfs2(v);
	return true;
}

WA submission: https://codeforces.com/contest/771/submission/69394496 AC submission: https://codeforces.com/contest/771/submission/69395025

  • Проголосовать: нравится
  • +1
  • Проголосовать: не нравится

»
4 года назад, # |
Rev. 3   Проголосовать: нравится +1 Проголосовать: не нравится

Let's say you make the first call dfs2(u) and then your condition : if(adj[u].size() != cur_sz — 1) is not true then you will always return true.

bool dfs2(int u)
{
	if(vis[u])
		return false;
	vis[u] = 1;
	if(adj[u].size() != cur_sz - 1)
		return false;
	for(int v : adj[u])
		if(!vis[v]) // you need to return what dfs2(v) gives u
			dfs2(v);

	return true; 
}

But thatshould not be the answer because imagine you have and edge (u,v) and then you call dfs2(v) and for v the condition if(adj[v].size() != cur_sz — 1) is true, then ur answer should be false. But you are always returing true because the call dfs(u) does that.

Hope it helps :)

  • »
    »
    4 года назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится

    Thank you so much for the detailed explanation! This answered my question.