題意:給一棵樹,查詢一些點對的距離
解法:隨便找乙個點建立有根樹,然後轉化為求點對最近公共祖先問題。兩點的距離等於他們與最近祖先的距離和。查詢的方法是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...