NOIP 2013 P1967 貨車運輸

2022-05-25 17:48:07 字數 1412 閱讀 8132

題目給出的是一張圖,在圖上有很多演算法無法實現,所以要將其轉化為樹

題中可以發現貨車的最後的載重量是由權值最小的一條邊決定的,所以我們求最大生成樹

求完最大生成樹後我們得到乙個森林

現在轉化為了求兩點路徑經過邊的邊權的最小值,用倍增演算法進行計算

#include #define inf 1e9

using

namespace

std;

const

int maxn=10100

;int n,m,first[maxn],nxt[maxn*10],point[maxn*10],len[maxn*10

];int q,tot,fa[maxn],f[maxn][21],chmin[maxn][21

],vi[maxn],de[maxn];

struct

node

sh[maxn*5

];void add_edge(int x,int y,int

z)void dfs(int x,int father,int deep,int last,int

visit)

}}int getfather(int

x)bool

cmp(node a,node b)

int lca(int a,int

b)//倍增求lca

}if (a==b)

return

min;

for (int i=20;i>=0;i--)

}min=min(min,min(chmin[a][0],chmin[b][0

]));

return

min;

}int

main()

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

fa[i]=i;

sort(sh+1,sh+1+m,cmp);

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

}//求最大生成樹

int now=0

;

for (int i=1;i<=n;i++)//可能有多棵樹,每棵樹分別考慮

for (int j=1;j<=20;j++)

}scanf("%d

",&q);

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

}

倍增求lca時避免父親倍增陣列出現0,倍增記錄最小值時,簡單寫法

int now=0

;

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

求deep時,注意不是求距離上的deep,而是層數

void dfs(int x,int father,int deep,int last,int

visit)

}}

Luogu P1967 NOIP2013 貨車運輸

這個題是很經典的生成樹問題。第一次接觸時對倍增演算法的理解還不夠透徹,沒能打出來正解。首先,原題中給出的是一幅圖,詢問從某點出發到另一點 需要經過的最短邊的最大值 用floyd來解決是可以的,但是資料範圍不能承受o n 3 的複雜度。於是我們考慮 假設原圖是連通的,那麼我們從某點到另一點,一定至少存...

P1967 貨車運輸

題目 題目描述 aa國有n n座城市,編號從 1 1到 nn,城市之間有 mm 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 qq 輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。輸入格式 第一行有兩個用乙個空格隔開的整數 n,mn,m,表示 aa 國...

P1967 貨車運輸

a 國有 n 座城市,編號從 1 到 n 城市之間有 m 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 q 輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。第一行有兩個用乙個空格隔開的整數 n m 表示 a 國有 n 座城市和 m 條道路。接下來 m ...