poj1984 帶權並查集 離線操作

2021-10-01 01:40:40 字數 1231 閱讀 4379

帶權並查集

題目大義:給你n個點,再給你m條垂直或水平的邊,每條邊分別連著兩個點,接下來會有k個詢問,每個詢問包含三個資料:u,v

,i

u,v,i

u,v,

i,表示在 第i條邊輸入後能不能將u,v之間的距離計算出來,如果可以計算,就輸出u,v之間的曼哈頓距離:∣x1

−x2∣

+∣y1

−y2∣

|x1-x2|+|y1-y2|

∣x1−x2

∣+∣y

1−y2

∣,否則就輸出:-1.可見,如果當前詢問的兩個點有關係就可以計算出來,那該如何快速判斷這兩個點有關係呢,因此我們想到並查集,其中邊就代表著這兩個點有關係,又考慮到本題的詢問的i值可能會雜亂無章,耗費時間,因此我們可以將詢問進行離線操作.

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn=

40005

;int n,m,k;

struct nodeq[maxn]

;//儲存輸入的邊

struct resulte[maxn]

;//儲存結果

bool

cmp(result a,result b)

struct question

//過載<

}w[maxn]

;struct gatherg[maxn]

;//儲存每個點的座標和它的父節點

void

init()

//初始化每個節點的父節點都是自己,座標都設定為原點,你也可以設定為其它

}int

finds

(int x)

//帶權並查集的路徑壓縮,不要搞錯語句的次序

void

join

(int u,

int v,

int length,

char s)

}int

main()

sort

(e,e+k,cmp)

;//恢復原來的1詢問次序

for(

int i=

0;i)return0;

}.```

poj1984(帶權並查集)

題意 給定n個farm,m條邊連線farm,k組詢問,詢問根據前t3條邊求t1到t2的曼哈頓距離,若不可求則輸出 1。思路 類似與poj1182,也是並查集的向量運用。用root i 表示farm i的祖先,x i y i 分別表示i到其祖先的曼哈頓距離的橫縱座標,這裡離線化先儲存邊的資訊,在詢問的...

並查集,帶權並查集

題意 ignatius過生日,客人來到,他想知道他需要準備多少張桌子。然而一張桌子上面只能坐上相互熟悉的人,其中熟悉可定義成為a與b認識,b與c認識,我們就說a,b,c相互熟悉 例如a與b熟悉and b與c熟悉,d與e熟悉,此時至少需要兩張桌子。輸入 t表示樣例個數,n表示朋友個數,朋友從1到n編號...

poj 1182 帶權並查集

description 動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃c,c吃a。現有n個動物,以1 n編號。每個動物都是a,b,c中的一種,但是我們並不知道它到底是哪一種。有人用兩種說法對這n個動物所構成的食物鏈關係進行描述 第一種說法是 1 x y 表示x和y是...