HDU 1520 題目中,vector<int> son[6007] 全局數組,主循環每次測試案例前調用 a[i].son.clear()。註釋掉這行導致 TLE(超時)。
vector::clear() 僅調用元素析構函數並置 size=0,**不釋放底層內存 (capacity 不變)**。
vector 數組,**生命周期贯穿整個程序**,不會自動析構釋放內存。clear(),上一輪殘留數據導致 son.size() 巨大,DFS 遍歷時循環次數爆炸 → TLE。clear() 後 capacity() 保持,下輪 push_back 復用內存,**無重複分配開銷**,效率極高。vector 析構時(離開作用域、delete、程序結束)。vector<int>().swap(v); (C++11 前) 或 v.shrink_to_fit(); (C++11 非強制)。shrink_to_fit() 或 swap 釋放內存給系統。// 錯誤:不 clear,上輪數據殘留
for (int i = 1; i <= n; i++) {
// a[i].son.clear(); // 註釋掉
a[i].is = a[i].v;
// ...
}
// 導致 son.size() 累積,DFS 遍歷無效節點,TLE
// 正確:clear 重置 size=0,capacity 保留
for (int i = 1; i <= n; i++) {
a[i].son.clear(); // 關鍵!
a[i].is = a[i].v;
// ...
}
clear() ≠ 釋放內存。**全局 vector 循環重用時,clear() 是為了重置邏輯尺寸、避免殘留數據污染算法邏輯**,同時保留容量避免重複分配。註釋掉導致 TLE 是因為遍歷了大量垃圾數據,而非內存不足。