Code: Select all
void dfs(int v, int p){
disc[v]=back[v]=++depth;
for(viit i=adj[v].begin(); i!=adj[v].end(); i++)if(*i != p){
if(!disc[*i]){
dfs(*i,v);
back[v]=min(back[v],back[*i]);
if((disc[v]!=1 && disc[v]<=back[*i])||(disc[v]==1 && disc[*i]>2))
art[v]=1;// (v) is an articulation point
}else back[v]=min(back[v],disc[*i]);
}
}
Code: Select all
void dfs(int v, int p){
disc[v]=back[v]=++depth;
for(viit i=adj[v].begin(); i!=adj[v].end(); i++)if(*i != p){
if(!disc[*i]){
dfs(*i,v);
if((disc[v]!=1 && disc[v]<=back[*i])||(disc[v]==1 && disc[*i]>2))
art[v]=1;// (v) is an articulation point
}
back[v]=min(back[v],back[*i]);
}
}
I do not know if this is algorithm is right nor wrong, I do not have a prove of either case.
I tried solving problem 2639 - Ant Hills, and both algorithms got Accepted. However every single Accepted solution other than mine uses the first code.
The question is: Is the second algorithm right or wrong? Can you prove it?
If it is wrong, then the datasets need refinement.
