poj 1986(離線查詢點對最近公共祖先)

2021-07-09 02:29:39 字數 993 閱讀 2396

題意:給一棵樹,查詢一些點對的距離

解法:隨便找乙個點建立有根樹,然後轉化為求點對最近公共祖先問題。兩點的距離等於他們與最近祖先的距離和。查詢的方法是dfs+並查集離線查詢。思想是,dfs過的為回溯的點的parent全部指向自己本身,vis標記為true。回溯之後的點parent指向自己的父親。然後dfs每進入乙個點,就處理這個點相關的查詢,如果其中某個查詢另乙個點v的vis為true,那麼它們倆的最近公共祖先就是並查集中v的最終祖先。

**:

#include #include #include #include using namespace std;

int n,m;

const int max=100100;

struct edge

edges[max*2];

int head[max];

int parent[max];

int dis[max];

int ans[max];

int count1=0;

vector> vec[max];

bool vis[max];

int getparent(int u)

void add(int u,int v,int dis)

void addedge(int u,int v,int r)

bool dfs(int u,int d)

}for(int i=0; i>n>>m;

memset(head,-1,sizeof head);

memset(vis,0,sizeof vis);

for(int i=0; i>r;

add(a,b,c);

add(b,a,c);

}int k;

cin>>k;

for(int i=0; i>a>>b;

addedge(a,b,i);

addedge(b,a,i);

}dfs(1,0);

for(int i=0; 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...

LCA Tarjin 並查集 離線

以前了解的tarjin演算法是用來求連通分量,在這裡是用來求最近公共祖先 並查集用過,很有意思的工具。kraskal演算法是並查集最經典的應用。首先初始化集合,每個元素為單個集合。集合,我們需要選出乙個代表,這個代表的性質是set u u。一開始乙個集合只有乙個元素,所以該集合的代表也就是該元素。當...

離線 並查集 Mootube

mootube 描述給定一顆n個節點的樹,定義兩點距離為他們之間路徑中邊權最小值。q次詢問k,v,詢問到v距離 k的點有多少 不含v 輸入第一行兩個整數n,q。接下來n 1行,每行3個整數u,v,w表示u,v之間有條路徑,長為w 接下來q組詢問,每組詢問2個整數k,v 輸出q行回答詢問 樣例輸入 4...