Codeforces celebrates 10 years! We are pleased to announce the crowdfunding-campaign. Congratulate us by the link https://codeforces.com/10years. ×

aa0809's blog

By aa0809, history, 4 weeks ago, ,

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;
return false;
if(!vis[v])
dfs2(v);
return true;
}


as opposed to

bool dfs2(int u)
{
if(vis[u])
return false;
vis[u] = 1;
return false;
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 weeks ago, # |   0 Auto comment: topic has been updated by aa0809 (previous revision, new revision, compare).
 » 4 weeks ago, # | ← 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 weeks ago, # ^ |   +1 Thank you so much for the detailed explanation! This answered my question.