火車運輸(NOIP2013)

2021-08-24 20:57:36 字數 1340 閱讀 1002

傳送藥水

(喝了這一壺傳送藥水,保你看了什麼題都覺得神清氣爽)

這題不算水。

首先想到,肯定需要跑一遍最大生成樹,因為我們需要盡可能大的限制。

那麼,接下來就是求兩點之間最小限制。

那麼就是我們就可以用求lca(最近公共祖先)來解決這個問題。

所以就倍增好了。

我們這裡倍增的有兩個陣列,乙個是祖先,另乙個是當前點到祖先的路上的最小限制。

最後理一遍思路:

先kruskal建立乙個最大樹(圖)。

然後bfs建立乙個樹,處理一些基本資料。

然後就用倍增求lca來解決就好了。

**如下:

#include

#include

#include

#include

#include

using

namespace

std;

struct edge;

int n,m;

int p[10005];

edge e[50005];

int f[10005][21],deep[10005];

int g[10005][21];

int vis[10005];

vector

g[10005],h[10005];

//int fa[10005];

int ques;

int find(int xx)

int cmp(edge a,edge b)

void kruscal()

for(int i=0;iint xx=find(e[i].u),yy=find(e[i].v);

if(xx!=yy)

}}void bfs()}}

}void init()}}

}int ans;

int jump(int u,int step)

void lca(int u,int v)

}ans=u==v?ans:min(min(ans,g[u][0]),g[v][0]);

}int main()

for(int i=0;iint ww;

scanf("%d%d%d",&e[i].u,&e[i].v,&ww);

e[i].w=max(e[i].w,ww);

}kruscal();

bfs();

init();

scanf("%d",&ques);

while(ques--)

if(find(u)!=find(v))elseelse}}

return

0;}

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