NOIp2013 貨車運輸 題解

2022-03-20 00:31:16 字數 1289 閱讀 5136

這題好。結論非常清新。

給你乙個 \(n\) 個點的圖,共有 \(m\) 條邊。有 \(q\) 次詢問,每次詢問兩點 \(x\) , \(y\),求從 \(x\) 到 \(y\) 的最小路徑最大值。

kruskal 構造最大生成樹,將其餘的邊去除。在這棵最大生成樹上跑 lca 就可以了,dfs 時統計到 \(2^i\) 級的祖先的最小路徑最大值,求 lca 一併整合就好了。

實現細節多的很。具體看**。

#include #include #include using namespace std;

const int maxm = 50005, maxn = 50005;

const int inf = 0x7f7f7f7f;

struct edge1 org[maxm];

struct edge2 e[maxm * 2];

inline bool cmp(edge1 a, edge1 b)

inline void swp(int &a, int &b)

inline int minn(int a, int b)

int n, m, head[maxn], cnt, fa[maxn][22], dep[maxn], lg[maxn], t; // lca 的陣列

int f[maxm], w[maxm][22]; //fa 是 dsu 的陣列,w 表示最大載重

bool vis[maxn]; //vis 是不連通化掃瞄

int find(int x)

void add(int u, int v, int w)

void kruskal() }}

void dfs(int now, int father, int weight) for(int i = head[now]; i; i = e[i].nxt) if(e[i].to != father) dfs(e[i].to, now, e[i].val);

return;

}int lca(int x, int y) if(x == y) return ans;

for(int k = lg[dep[x]] - 1; k >= 0; k --)

if(fa[x][k] != fa[y][k])

ans = minn(minn(ans, w[x][0]), w[y][0]);

return ans;

}int main()

}

學你媽,還有兩天就要 csp 了老子才開始複習

題解 NOIP2013 貨車運輸

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

noip2013貨車運輸

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

NOIP 2013 貨車運輸

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