洛谷P2245 星際導航 kruskal重構樹

2021-09-20 04:01:41 字數 2052 閱讀 5006

sideman 做好了回到 \textgliese 星球的硬體準備,但是 \textsideman 的導航系統還沒有完全設計好。為了方便起見,我們可以認為宇宙是一張有 nn 個頂點和 mm 條邊的帶權無向圖,頂點表示各個星系,兩個星系之間有邊就表示兩個星系之間可以直航,而邊權則是航行的危險程度。

\textsideman 現在想把危險程度降到最小,具體地來說,就是對於若干個詢問 (a, b)(a,b),\textsideman 想知道從頂點 aa 航行到頂點 bb 所經過的最危險的邊的危險程度值最小可能是多少。作為 \textsideman 的同學,你們要幫助 \textsideman 返回家園,兼享受安全美妙的宇宙航行。所以這個任務就交給你了。

輸入輸出格式

輸入格式:

第一行包含兩個正整數 nn 和 mm,表示點數和邊數。

之後 mm 行,每行三個整數 aa,bb 和 ll,表示頂點 aa 和 bb 之間有一條邊長為 ll 的邊。頂點從 11 開始標號。

下面一行包含乙個正整數 qq,表示詢問的數目。

之後 qq 行,每行兩個整數 aa 和 bb,表示詢問 aa 和 bb 之間最危險的邊危險程度的可能最小值。

輸出格式:

對於每個詢問, 在單獨的一行內輸出結果。如果兩個頂點之間不可達, 輸出 \textimpossible。

#include

using

namespace std;

const

int maxn =

1e6+5;

int head[maxn]

, top[maxn]

, father[maxn]

;int son[maxn]

, size[maxn]

, depth[maxn]

;int fa[maxn]

, val[maxn]

, l[maxn]

, r[maxn]

, vis[maxn]

;int n, m, q, u, v, tot, cnt, index;

struct node

}a[maxn]

;struct edge edge[maxn]

;int

find

(int x)

void

init()

void

add(

int u,

int v)

void

dfs1

(int u,

int fa)

dfs1

(to, u)

; size[u]

+= size[to];if

(size[to]

> maxson)}}

void

dfs2

(int u,

int topf)

for(

int i = head[u]

; i !=-1

; i = edge[i]

.next)

dfs2

(to, to);}

r[u]

= index;

}int

lca(

int x,

int y)

x = father[top[x]];

}if(depth[x]

> depth[y]

)return x;

}void

kruskal()

sort

(a +

1, a + m +1)

;for

(int i =

1; i <= m; i++)}

for(

int i=

1;i<=cnt;

++i)}}

intmain()

kruskal()

; cin >> q;

while

(q--

) cout << val[

lca(u, v)

]<< endl;

}return0;

}

洛谷P2245 星際導航

sideman做好了回到gliese 星球的硬體準備,但是sideman的導航系統還沒有完全設計好。為了方便起見,我們可以認為宇宙是一張有n 個頂點和m 條邊的帶權無向圖,頂點表示各個星系,兩個星系之間有邊就表示兩個星系之間可以直航,而邊權則是航行的危險程度。sideman 現在想把危險程度降到最小...

P2245 星際導航

sideman做好了回到gliese星球的硬體準備,但是sideman的導航系統還沒有完全設計好。為了方便起見,我們可以認為宇宙是一張有 n 個頂點和 m 條邊的帶權無向圖,頂點表示各個星系,兩個星系之間有邊就表示兩個星系之間可以直航,而邊權則是航行的危險程度。sideman現在想把危險程度降到最小...

P2245 星際導航

sideman 做好了回到gliese星球的硬體準備,但是sideman的導航系統還沒有完全設計好。為了方便起見,我們可以認為宇宙是一張有n 個頂點和m 條邊的帶權無向圖,頂點表示各個星系,兩個星系之間有邊就表示兩個星系之間可以直航,而邊權則是航行的危險程度。sideman 現在想把危險程度降到最小...