洛谷 P1967 貨車運輸

2021-10-02 09:56:04 字數 2193 閱讀 3284

最初拿到這道題時,我先莫名想到最大流,然後讀著讀著題。。。

好了,這道題顯然就是個生成樹

那麼我最初拿的最值生成樹的思想,把邊從大到小排序,然後一一加邊,具體實現完全類似最小生成樹,直到目標起點終點在乙個並查集內

為啥我先本質後實際

實際這個做法顯然是t了,我們發現我們這樣最差每次求乙個最大生成樹,那肯定不行啊,如果我們最開始把最大生成樹求好,我們在樹上處理就好了

所以我們可以先求一遍最大生成樹,再求目標兩點的唯一路徑的最小值,這個解一定是最優的,畢竟我們找最大生成樹的時候,排了個序,保證任何不定的值取最大那乙個

於是我們可以找兩點間lca,邊找邊處理兩點間所有邊的邊權的min

#include

#include

#include

#include

#include

using

namespace std;

struct edgeedge[

1000100];

int fa[

1000100

],cnt,head[

1000100

],n,m,x,y,q,start,end;

void

file()

inline

intread()

intfind

(int x)

intcmp

(edge a,edge b)

intmain()

sort

(edge+

1,edge+m+

1,cmp)

;q=read()

;for

(int i=

1;i<=q;i++)if

(flag)

printf

("%d\n"

,edge[cnt-1]

.dis);}

}

#include

#include

#include

#include

#include

using

namespace std;

struct edge1edge1[

1000100];

struct edgeedge[

1000100];

int fa[

1000100

],cnt,head[

1000100

],n,m,x,y,q,start,end;

int my_log2[

1000100

],depth[

1000100

],f[

100010][

30],w[100010][

30],vis[

1000100];

//w[now][k]表示now點到該點的2^k級祖先間的min

//f[now][k]表示now點的2^k級祖先

void

file()

inline

intread()

intfind

(int x)

void

add(

int u,

int v,

int t)

intcmp

(edge1 a,edge1 b)

void

kruscal()

}}void

dfs(

int now)

}int

lca(

int x,

int y)}if

(x==y)

return ans;

for(

int i=

20;i>=

0;i--)}

return

min(ans,

min(w[x][0

],w[y][0

]));

}int

main()

kruscal()

;for

(int i=

1;i<=n;i++)}

for(

int i=

1;i<=

20;i++)}

q=read()

;for

(int i=

1;i<=q;i++

)}

洛谷 P1967 貨車運輸

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

洛谷 P1967 貨車運輸

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

貨車運輸 洛谷p1967

解法一 30分 直接跑spfa,求最大瓶頸路。include include include define f i,l,r for i l i r i using namespace std const int maxn 10005,maxm 50005,inf 100000000 struct e...