訓練賽遇到了和貨車運輸一模一樣的題:
沒有想到最大生成樹,當時考慮到了刪除無效邊,但是並沒有意識到刪除之後圖會退化成樹,也沒有意識到先對邊進行排序。
思路: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 國有 ...