洛古1967 貨車運輸

2021-08-22 10:11:59 字數 1296 閱讀 7546

具體思路:

最大生成樹 + 倍增lca

首先感謝tqc大佬為我的耐心修改**(你可能是改了個shi… …)

貼**using namespace std;

const int maxn = 100005;

const int maxm = 100005;

int n,m,head[maxn],father[maxn],top,depth[maxn],par[maxn][22],pre[maxn][22];

int ans = 1e9;

struct edge_pro ea[maxm<<1];

//題目要求的樹

struct edge e[maxm<<1];

//最大生成樹里的樹

bool cmp (edge_pro a,edge_pro b)

int find(int x)

void unionn (int r1,int r2)

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

void dfs(int u)

} void init()

}int lca(int x,int y)

if(x == y) return ans;

for(int j = log(n);j >= 0 ;–j)

if(par[x][j] != par[y][j])

ans = min(ans , min(pre[x][0] , pre[y][0]));

return ans;

}int main()

for(int i = 1;i <= n ;++i) father[i] = i;

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

int k = 0;

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

if(k == n - 1) break;

} //以上是生成樹的內容啦…

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

if(!depth[i])

init();

int q; scanf(「%d」,&q);

while(q–)

return 0;

}個人對這個題的理解就是

1. 這種題第一步就是要想到建兩個圖的問題(這已經是我第二次見這種題 感覺掌握的還可以一點)

2. 倍增lca的基本操作什麼的 比如說這個題裡的pre【i】【j】記錄的是從i點開始 2^j步路徑上的邊權最小值(可能有點繞口???)

洛谷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 國有 ...