一道很水的ufs題,但是維護節點資訊的時候卻遇到了乙個我以前從來沒有想過也從來沒有遇到過的問題:
以前在合併兩個節點的時候總是先判斷它們是否在同一集合中,然後再合併;這樣在判斷的過程中就更新了節點資訊。但這道題有乙個奇怪的地方時它不需要判斷,於是我就也傻乎乎的直接合併了資訊,導致合併的資訊是滯後的。從而導致wa掉了,而且一直找不到原因,直到下了資料才搞明白。
這道題給了我兩點啟示:
①(直接的)在ufs題目中在union操作之前一定要先更新節點資訊。
②(深層次的)在寫**時一定要謹慎小心,精神集中,弄清各個變數的意義及其變化,才能避免出錯。
**:#include
using namespace std;
#include
#include
#include
#include
char * ptr=new char [1000001];
struct sq[10001];
inline bool cmp(s a,s b)
int fa[40001],f1[40001],f2[40001],lth[40001],v[40001],h[40001],ans[10001];
inline int find(int x)
return fa[x];
}inline void in(int &x)
inline void in(char &x)
char c[40001];
int main()
in(k);
for(i=0;iin(q[i].f1);
in(q[i].f2);
in(q[i].i);
q[i].x=i;
}sort(q,q+k,cmp);
q[k].i=-1;
for(i=0,++n;ifor(i=1;ifind(f2[i]);
switch(c[i])
fa[fa[f1[i]]]=fa[f2[i]];
while(q[j].i==i)
}for(i=0;iprintf("%d\n",ans[i]);
return 0;
}
poj1984(帶權並查集)
題意 給定n個farm,m條邊連線farm,k組詢問,詢問根據前t3條邊求t1到t2的曼哈頓距離,若不可求則輸出 1。思路 類似與poj1182,也是並查集的向量運用。用root i 表示farm i的祖先,x i y i 分別表示i到其祖先的曼哈頓距離的橫縱座標,這裡離線化先儲存邊的資訊,在詢問的...
poj1984 帶權並查集 離線操作
帶權並查集 題目大義 給你n個點,再給你m條垂直或水平的邊,每條邊分別連著兩個點,接下來會有k個詢問,每個詢問包含三個資料 u,v i u,v,i u,v,i,表示在 第i條邊輸入後能不能將u,v之間的距離計算出來,如果可以計算,就輸出u,v之間的曼哈頓距離 x1 x2 y1 y2 x1 x2 y1...
poj解題報告 1328
不得不說,這題是讓我飽受折磨,畢竟第一次做貪心演算法,而且wa了好多次,幸好有學長的幫助,最終找到了問題所在,是在快排上是問題,double高位不可向int低位轉換,由於一開始強制轉換導致雖然樣例和其他的測試資料過了,但還是wa,現在改完了就對了,附上ac ps 這題通過率是22 真心不簡單 如下 ...