首先,江老師評價了一下我們的博客,說我的tree那題沒有用新學的方法做,所以我就在博客上貼了程序
在這裏,江老師講了兩個很重要的概念:
1、靜態和動態:
按照tree那題來舉例:
按照楊鴻飛的方法壓縮路徑就是屬於靜態,而用我們學的方法就是屬於動態:
靜態:
for(int i=1;i<=n;i++)
fa[i]=getf(i);
動態:
while(fa[x]!=x)
{
int y=fa[x];
fa[x]=root;
x=y;
}
靜態就是整個變化過程完了之後在處理,動態就是有變化就處理,有變化就處理。
靜態——最後處理;
動態——中間處理;
好吧其實我寫想和博客時都有點暈,不怎麼搞得清楚,不過到時候江老師會再詳細地講,到時候再做補充吧。
2、不會做題時找出思緒的有效方法:
畫大量的例子!!
這樣一能讓我們熟悉題目的特徵,二來有時還能找到一些規律。
好吧暫時先寫這麼多,回到家再寫吧。
回家續寫:
後來老師又講到galaxy,說到了它的解題思路:
由於這題屬於並查集,而並查集的特點就是壓縮路徑,所以就是講了 壓縮路徑的方法(不壓縮路徑也會超時)。
先定義一個結構體,裏面除了包括正常那些外,在加多一個這個這個節點到根的距離。每次需要用到這個節點時就求距離,然後把兩個節點的距離差求出來,就能求出這兩個節點(艦隊)之間有多少個節點(艦隊)。
接着老師講了遞歸來找根,這樣不僅能順便壓縮路徑,而且程序非常短。
int getf(int x) { if(x==fa[x]) return x; return fa[x]=getf(fa[x]); }
|
程序十分簡單,但是也有一點小問題:
1、 如果這棵樹特別深,那麼就要開十分多的getf()函數,這有可能空間會爆掉。
2、 如果是一個環形,像這個一樣怎麼辦?它會無限遞歸一直退不出來。
所以我們就要用到“啓發式”來解決:拿小的來連大的。
具體如何做江老師說以後會學到,那麼就先不要理它了。
然後江老師順便講了一下明天要學的哈希(hash)算法,大概就是說如何快速比較兩個數的不同之類的。今天特別晚,那這個就留到明天的博客再寫吧。