P2245 星際導航 瓶頸路

2022-07-20 04:09:11 字數 1818 閱讀 9959

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

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

第一行包含兩個正整數 \(n\) 和 \(m\),表示點數和邊數。

之後 \(m\) 行,每行三個整數 \(a\),\(b\) 和 \(l\),表示頂點 \(a\) 和 \(b\) 之間有一條邊長為 \(l\) 的邊。頂點從 \(1\) 開始標號。

下面一行包含乙個正整數 \(q\),表示詢問的數目。

之後 \(q\) 行,每行兩個整數 \(a\) 和 bb,表示詢問 \(a\) 和 \(b\) 之間最危險的邊危險程度的可能最小值。

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

4 5

1 2 5

1 3 2

2 3 11

2 4 6

3 4 4

32 3

1 41 2

5

45

對於 \(40\%\) 的資料,滿足 \(n \leq 1000, m \leq 3000, q \leq 1000\)。

對於 \(80\%\) 的資料,滿足 \(n \leq 10000, m \leq 10^5, q \leq 1000\)。

對於 $100%$100% 的資料,滿足 \(n \leq 10^5, m \leq 3 \times 10^5, q \leq 10^5, l \leq 10^9\)。資料不保證沒有重邊和自環。

乙個無向圖,看到最大邊最小,我去,最小生成樹。。。

然後神奇的發現,題目不保證沒有重邊自環的問題就解決了

於是我們就得到了乙個森林

每次詢問兩個點,如果不在一棵樹中(通過最小生成樹的ufs判斷)輸出無解

否則輸出其路徑上最大邊邊權,顯然倍增搞一下就行了

#include#define ll long long

ll in()

int n, m;

const int maxn = 1e5 + 10;

struct node

void *operator new(size_t)

}*head[maxn];

bool vis[maxn];

int dep[maxn];

struct e

}e[maxn << 2];

int f[maxn][25], max[maxn][25];

int b[maxn];

void add(int from, int to, int dis)

int findset(int x)

void kruskal() }}

void dfs(int x, int fa)

}void beizeng()

}int lca(int x, int y)

return std::max(dis, std::max(max[x][0], max[y][0]));

}void query()

}int main()

P2245 星際導航

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

P2245 星際導航

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

洛谷P2245 星際導航

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