貨車運輸(NOIP2013)

2021-08-21 12:09:40 字數 1259 閱讀 5570

這道題其實思路很顯然,就是最大生成樹加倍增。

我們來順著**講一遍。

我們先讀入n和m

然後把所有邊的權值設定為0

讀入時,重複的邊只取最大(很顯然)

然後kruscal進行最大生成樹,用g和h兩個vector分別去儲存邊和權值

然後倍增即可。

具體看**:

#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];//f表示節點u的k級祖先,deep是深度

int g[10005][21];//表示節點u到u的k級祖先上最小權值

int vis[10005]; //用於bfs

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