NOIP2013 貨車運輸

2022-07-16 19:36:10 字數 1315 閱讀 7791

好坑啊!算了,還是怪我lca寫的不熟,沙茶一般把j

首先,我們可以生成一下最大生成樹,保證每個點都連通的情況下,每條路的限重盡量大。但是注意點並不一定都連通,因此我們需要建立多棵最大生成樹。然後我們的任務就是查詢兩點間路徑上的最小邊權,暴力的話複雜度難以接受,這是我們就可以使用一種較好的方法——倍增。說白了,就是在求lca的同時維護路徑上的最小邊權。初始化時,mine[i][0]=w[i][fan[i][0]];然後有mine[i][j]=min(mine[i][j-1],mine[fan[i][j-1]][j-1])。再就是建樹的過程容易出錯,應該注意。

1 #include2 #include3 #include4 #include5

using

namespace

std;

6 inline int min(int a,int b)

7 inline void swap(int& a,int& b)

8 inline int

get_num()

15void put_num(int

i) 20

const

int maxn=1e4+5,maxm=5e4+5,maxb=15,inf=0x3f3f3f3f;21

struct

edge

26} edge[maxm];

27int

fa[maxn],d[maxn],fan[maxn][maxb],mine[maxn][maxb];

28int f(int

i) 32

int dfs(int

v) 37

int query(int x,int

y) 51

return min(mmin,min(mine[x][0],mine[y][0

]));52}

53int

main()

60 sort(edge+1,edge+m+1

);61

for(int i=1;i<=n;++i) fa[i]=i;

62 memset(mine,inf,sizeof

(mine));

63for(int i=1;i<=m&&cnt1;++i)

67for(int i=1;i<=n;++i)

72for(int j=1;jj)

73for(int i=1;i<=n;++i)

77int q=get_num(),first=1;78

for(int i=1;i<=q;++i)

85return0;

86 }

ac**

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...