正確寫法:
// 根據(jù)parent列表糯累,從end到begin自底向上DFS遍歷
void DFS_Path(vector<vector<int>>&parent,vector<int>&s,int start,int& max_group,int& max_calc){
// 堆棧用來存儲DFS的路徑
int i,j;
// 觸底
if(start==begining){
max_group++;
//s.push_back(begining);
//show(s);
// clacmax(s,max_calc);
int might=0;
for(i=s.size()-1;i>=0;i--){
//cout<<">>"<<s[i];
might+=saver[s[i]];
}
if(might>max_calc){
max_calc=might;
}
//s.pop_back();
return;
}
// 未觸底
for(i=0;i<parent[start].size();i++){
s.push_back(parent[start][i]);
DFS_Path(parent,s,parent[start][i],max_group,max_calc);
s.pop_back();
}
}
錯誤寫法:
void DFS_Path(vector<vector<int>>&parent,vector<int>&s,int start,int& max_group,int& max_calc){
// 堆棧用來存儲DFS的路徑
int i,j;
for(i=0;i<parent[start].size();i++){
// 未觸底
if(parent[start][i]!=begining){
s.push_back(parent[start][i]);
DFS_Path(parent,s,parent[start][i],max_group,max_calc);
s.pop_back();
}
// 觸底
else{
max_group++;
s.push_back(parent[start][i]);
// show(s);
// clacmax(s,max_calc);
int might=0;
for(i=s.size()-1;i>=0;i--){
//cout<<">>"<<s[i];
might+=saver[s[i]];
}
if(might>max_calc){
max_calc=might;
}
s.pop_back();
return;
}
}
return;
}
兩種DFS遞歸的寫法差異在于:
錯誤的寫法把if...return寫在了for循環(huán)里面展运,沒有function保護情況下導(dǎo)致for循環(huán)中斷源葫,最后少遍歷了幾個解最后出錯。
正確的寫法把if...return些在了循環(huán)外面,避免了循環(huán)中斷迅栅。