补记:
关于非递归版本为何会超时,今天早晨就有了答案。请教同学之后,了解到真正的原因:STL对于算法练习的代码而言,还是太慢了(说STL效率高是在实际工程中,使用STL一般不会拖后腿)。改用数组模拟栈就不超时了,耗时比递归稍微少一些,可以忽略不计(看来理论上说得通的东西实际中总体还是不会错的)。
//非递归版本的find函数。递归版本忘记怎么写了,就写一个非递归版本。
//事实上find就做了一件事:
//1.如果x==p[x],返回x的值
//2.否则,从叶子结点x出发一路向上直到找到树根,并把沿途经过的所有结点(包括x)都指向树根,即参照案件都设置为树根上面的案件,并更新关系。
int myFind(int x)
{
if(x==p[x]) return x;
int wp=x; //wp means waypoints
int ind=-1; //栈空时候的指针位置
while (wp!=p[wp])
{
wpstack[++ind]=wp;//wpstack是用于模拟栈的全局数组
wp=p[wp];
} //此while结束后wp就是始祖了
int cf=wp; //cf means current father
int cn; //cn means current node
while (ind!=-1)
{
cn=wpstack[ind--];
p[cn]=wp; //把沿途所有结点指向始祖wp
r[cn]=(r[cn]+r[cf])%2; //更新与始祖wp的关系
cf=cn; //更新当前父结点
}
return wp;
}
这是题目:
3:Find