noip2013 貨車運輸

2022-05-19 11:24:15 字數 1847 閱讀 6451

a國有n座城市,編號從1到n,城市之間有m條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有q輛貨

車在運輸貨物,司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。 

第一行有兩個用乙個空格隔開的整數n,m,表示a國有n座城市和m條道路。 

接下來m行每行3個整數x、y、z,每兩個整數之間用乙個空格隔開,表示從x號城市到y號城市有一條限重為z的道路。 

注意:x 不等於 y,兩座城市之間可能有多條道路。 

接下來一行有乙個整數q,表示有q輛貨車需要運貨。 

接下來q行,每行兩個整數x、y,之間用乙個空格隔開,表示一輛貨車需要從x城市 

運輸貨物到y城市,注意:x不等於y 。 

0< n < 10,000

0< m < 50,000

0< q < 30,000

0 < = z < = 100,000 

輸出共有q行,每行乙個整數,表示對於每一輛貨車,它的最大載重是多少。

如果貨車不能到達目的地,輸出-1 。 

4 3 

1 2 4

2 3 3

3 1 1

3 1 3

1 4

1 3

3 

-1 3

首先,先建乙個最大生成樹,目的是為了將不必要的路徑去掉,我們知道要得到最大的載重,肯定是要在每條路上載重肯定要盡量大,資料太大,採用kruskal來求。

建好圖之後跑lca,得到最近公共祖先之後,再去求起點到最近公共祖先最小的承重和最近公共祖先到終點的最小載重,取其中較小值就是答案。

為什麼取較小的,明明求的是最大載重。

舉個例子,你在這條路上能載4kg的物品,但是下一段路只能載3kg,請問最大載重是4嗎,如果是,下一段路怎麼走?

所以,還是乖乖看**吧

1 #include2 #include3 #include4 #include5

using

namespace

std;

6int son[20001],nex[20001],pre[10001],fa[10001],f[10001][20],len[20001],k[10001],n,m,a,b,c,root,deep[10001],tot,ans,dis[10001][20];7

bool used[10001];8

structoo9

v[50001

];12

char ch; bool

ok;13

void read(int &x)

18 inline int find(int

x)19

23bool

cmp(oo l,oo p)

2427 inline void add(int x,int y,int

z)28

35 inline void dfs(int

now)

3644

for(int i=pre[now];i;i=nex[i])

4553}54

int put(int x,int

y)5566}

67return

ans;68}

69 inline int lca(int x,int

y)70

82int

main()

83104

}105

for(int i=1;i<=n;i++)if(!used[i])dfs(i);

106read(sum);

107int

begin,end;

108for(int i=1;i<=sum;i++)

109117

}118 }

noip2013貨車運輸

貨車運輸 truck.cpp c pas 問題描述 a 國有n座城市,編號從1到n,城市之間有 m條雙向道路。每一條道路對車輛都有重 量限制,簡稱限重。現在有 q輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的 情況下,最多能運多重的貨物。輸入 輸入檔名為truck.in。輸入檔案第一行有兩個...

NOIP 2013 貨車運輸

題目描述 description a 國有 n 座城市,編號從 1 到 n,城市之間有 m 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 q輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。輸入描述 input description 第一行有兩個用乙個...

NOIP 2013 貨車運輸

題目大意 給定一張無向圖 以及若干個詢問 對於每個詢問求所有由節點u到節點v的路徑上邊權的最小值的最大值。題解 首先用構造一棵最大生成樹,這樣保證樹上兩個節點路徑邊權的最小值最大 在最大生成樹上兩個節點之間只有一條路徑,所以只需要找路徑上邊權的最小值 為了快速的尋找最小值,利用樹上倍增的想法用f j...