這題好。結論非常清新。
給你乙個 \(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 第一行有兩個用乙個...