最初拿到這道題時,我先莫名想到最大流,然後讀著讀著題。。。
好了,這道題顯然就是個生成樹
那麼我最初拿的最值生成樹的思想,把邊從大到小排序,然後一一加邊,具體實現完全類似最小生成樹,直到目標起點終點在乙個並查集內
為啥我先本質後實際
實際這個做法顯然是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...