洛谷 貨車運輸

2021-09-12 12:43:23 字數 1534 閱讀 8788

訓練賽遇到了和貨車運輸一模一樣的題:

沒有想到最大生成樹,當時考慮到了刪除無效邊,但是並沒有意識到刪除之後圖會退化成樹,也沒有意識到先對邊進行排序。

思路:1. 空間不夠開n*n,所以不可能直接記錄2點之間的答案。

2. 所以對於每次查詢可能是logn內解決。

3. 應該有一些邊是沒有用的。

4. 觀察資料範圍猜想可能需要對邊進行排序。

5. 對邊從大到小排序後想辦法判斷哪些邊是沒有用的。

6. 如果該邊的兩端點u,v 已經聯通,那麼該邊一定沒有價值,因為之前的所有邊的權值都大於該邊的權值。如果已經未聯通,那麼該邊一定需要,作為u->v的答案,之後u-v的最大值不會再被更新。

7. 到此為止,得到了判斷邊是否有價值的充要條件,判斷聯通可以用並查集。

8. 原來只是一道最大生成樹而已!!!

9. 圖退化為樹,任意兩點間路徑唯一。

10. 查詢鏈上最小值?樹鏈剖分?

11. lca!

#include #define ll long long

#define mp make_pair

#define pb push_back

#define sec second

#define fir first

#define rep(i,a,b) for(int i = (a); i <= (b); i++)

#define per(i,a,b) for(int i = (a); i >= (b); i--)

#define all(x) (x).begin(), (x).end()

#define sz(x) ((int)(x).size())

using namespace std;

const int n = 5e5+1000;

int fa[n][20],len[n][20];

int deep[n];

int f[n];

int find(int u)

struct node

node(int _u, int _v, int _w)

bool operator < (node b) const

}s[n];

vectoredge[n];

void dfs(int u, int f, int d,int w)

}void init(int n)

}int lca(int u, int v)

if(u == v) return ans;

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

if(fa[u][i] != fa[v][i])

return min(ans,min(len[u][0],len[v][0]));

}int main()

}len[1][0] = 1e9;

dfs(1, 0, 1, 1e9);

init(n);

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

return 0;

}

洛谷1967 貨車運輸

to神犇 請自動跳過前 x行的吐槽,因為吐槽內容可能只是一些極其無聊的 bug和友情提示 codevs 上的資料略水 水了 8個點 洛谷資料和官方一致。題目描述 a 國有n 座城市,編號從1 到 n,城市之間有 m 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 q 輛貨車在運輸貨物,司...

洛谷 1967 貨車運輸

在圖上從x到y找一條簡單路徑,使得路徑上最小值最大 暴力會t因為需要的是較大的那些邊,故可以求最大生成樹,然後lca陣列開小了 include include include define inf 0x3f3f3f3f define maxn 50005 using namespace std in...

洛谷 P1967 貨車運輸

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