洛谷2245 星際導航

2021-09-30 16:21:46 字數 2407 閱讀 2339

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

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

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

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

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

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

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

輸入樣例#1:

4 5

1 2 5

1 3 2

2 3 11

2 4 6

3 4 4

3 2 3

1 4

1 2輸出樣例#1:

5 4

5對於40% 的資料,滿足n≤1000,m≤3000,q≤1000。

對於 80% 的資料,滿足n≤10000,m≤105,q≤1000。

對於 100% 的資料,滿足n≤105,m≤3×105,q≤105,l≤109。資料不保證沒有重邊和自環。

這道題和noip2013貨車運輸的本質是一模一樣的

顯然可以用更好的方法來解決(網路流、樹鏈剖分等)

但是我這個蒟蒻用最弱的方法:最小生成樹+lca

但是,一定有人會有疑問,為什麼是最小生成樹

我們可以簡單的證明一下

假設當前的兩個節點之間,最小生成樹上的最大邊權是x

但是存在另外一條路徑的邊權的最大值是x』,且x『 < x

這種情況會不會存在?

最小生成樹是將邊按照權值排序後再來鏈結

如果存在x』所在的這一條路徑的話,必定會優先選擇x』所在的路徑

而不是x所在的路徑

(為什麼請自己考慮一下)

那麼,知道結果必定在最小生成樹上

問題迎刃而解

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define max 110000

#define maxl 510000

#define inf 0

inline

int read()

while(ch>='0'&&ch<='9')

return x*t;

}int f[max],dep[max];

int minl[max][21],p[max][51];

int n,m,q,u,v,w;

struct line

e[maxl];

struct edge

e[maxl];

int h[max],cnt=1,tot=1;

inline

void add(int u,int v,int w)//建邊

; h[u]=tot++;

}inline

bool

operator

<(line a,line b)//需要求最小生成樹

void build(int u,int ff)//建樹

}}void prepare()//lca的預處理

}}int query(int u,int v)//詢問

if(u==v)

return ans;

for(int j=20;j>=0;--j)//找到lca並求解

}ans=max(ans,minl[u][0]);

ans=max(ans,minl[v][0]);

return ans;

}int main()

; sort(&e[1],&e[m+1]);

//克魯斯卡爾求最小生成樹

for(int i=1;i<=n;++i)f[i]=i;//並查集初始化

for(int i=1;i//克魯斯卡爾

for(int i=1;i<=n;++i)//建樹

if(!dep[i])

prepare();//lca準備

q=read();

while(q--)

}

洛谷P2245 星際導航

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

洛谷P2245 星際導航 kruskal重構樹

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

Luogu P2245 星際導航

kruskal重構樹的板子題 和貨車運輸一樣滴 會的可以寫這個 我直接改的貨車運輸當時的倍增lca的 思路就是建出最小生成樹 因為顯然一些邊權很大的邊是不可能走的 然後倍增維護路徑上邊權的極值 include include include include include include inclu...